RFC-1123 的 DateTime 给出了不准确的时区

Posted

技术标签:

【中文标题】RFC-1123 的 DateTime 给出了不准确的时区【英文标题】:DateTime to RFC-1123 gives inaccurate timezone 【发布时间】:2011-01-16 00:47:22 【问题描述】:

如果我获得了 DateTime 对象的 RFC-1123 格式日期,它会给出当前的本地时间,但会给出 GMT 时区(这是不准确的)。DateTime.Now.ToString("r"); 返回Fri, 12 Feb 2010 16:23:03 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 位并替换它似乎非常混乱。

有没有办法强制它包含正确的时区?

【问题讨论】:

【参考方案1】:

.NET 实现总是将结果表示为 GMT,而不管实际日期的时间偏移。

通过使用DateTime.Now.ToString("r");,您实际上是在说String.Format("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", DateTime.Now);,它是.NET RFC1123 格式字符串,如MSDN - The RFC1123 ("R", "r") Format Specifier 所示。

要获得所需的行为,您可能应该使用String.Format,并将说明符的固定“GMT”部分替换为时间偏移说明符:

The "z" Custom Format Specifier The "zz" Custom Format Specifier The "zzz" Custom Format Specifier

【讨论】:

【参考方案2】:

你可以只做DateTime.UtcNow.ToString ("R"),你仍然会得到GMT时区,但时间会正确偏移。

【讨论】:

这是正确的,但是,您仍然必须更换时区。这就是我知道我的服务器是 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", );

以上是关于RFC-1123 的 DateTime 给出了不准确的时区的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的 RFC1123 和 RFC2822 日期时间格式有啥区别?

如何使用 XSLT 2.0 获取当前日期时间的 RFC1123 日期格式

python中的RFC 1123

BigQuery 将 RFC 1123 日期格式字符串转换为 unixtime

java中将RFC1123日期时间格式化

python http://stackoverflow.com/questions/225086/rfc-1123-date-representation-in-python