日期时间转换为RFC-1123格式会导致时区不准确

4
如果我获取DateTime对象的RFC-1123格式化日期,它会给出当前本地时间,但是时区为GMT(这是不准确的)。
下午4:23,但我的时区是UTC+10(此外,我们目前正在观察夏令时)。
现在,我可以通过先转换为UTC来获得“正确”的返回值: DateTime.UtcNow.ToString("r");
返回 Fri, 12 Feb 2010 05:23:03 GMT
然而,理想情况下,我想得到正确的时区,这应该是 Fri, 12 Feb 2010 16:23:03 +1100
传递当前的CultureInfo并没有改变任何内容。我可以使用TimeZoneInfo.Local.GetUtcOffset(...)获取UTC偏移量,并从中格式化时区字符串,但是剥离GMT部分并替换它似乎是多余的混乱。
有没有一种方法可以强制它包含正确的时区?
2个回答

4
.NET的实现始终将结果表示为GMT,而不管实际日期的时间偏移量如何。使用DateTime.Now.ToString("r");实际上是在说String.Format("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", DateTime.Now);,这是.NET RFC1123格式字符串,正如MSDN所指示的那样-RFC1123("R","r")格式说明符。为了获得所需的行为,您可能应该使用String.Format,并用时间偏移说明符替换说明符的固定'GMT'部分:

4
你可以直接使用 DateTime.UtcNow.ToString ("R"),这样你仍然会得到格林威治标准时间,但时间将被正确地调整。

1
这是正确的,但你仍然需要替换时区。这是我使用的已知服务器为 EST。date.ToLocalTime().ToString("R").Replace("GMT", "EST")。如果您要修改 Web 请求中的日期头,则可以使用此方法。我在开发和生产环境中都使用它,它有效。MethodInfo priMethod = client.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic); priMethod.Invoke(client.Headers, new object[] { "Date", <上述转换> }); - Anthony Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接