【问题标题】:Bug in .NET's DateTime.ToString("R") with UTC dates?.NET 的 DateTime.ToString("R") 中带有 UTC 日期的错误?
【发布时间】:2014-10-06 10:27:44
【问题描述】:

我在英国(目前是 GMT+1 时间)。

如果我运行这个:

> DateTime.UtcNow.ToString("R")  // Or...
> DateTime.Now.ToUniversalTime().ToString("R")
"Mon, 06 Oct 2014 10:20:00 GMT"

正确答案。
如果我现在运行相同,没有 UTC DateTime 转换:

> DateTime.Now.ToString("R")
"Mon, 06 Oct 2014 11:20:00 GMT"

打印的时间正确,但时区错误。我希望相反:

"Mon, 06 Oct 2014 11:20:00"  // Or..
"Mon, 06 Oct 2014 11:20:00 BST"

问题:这种行为是设计使然吗?我能否获得与“R”格式相同的输出,但使用正确的时区指示符?

【问题讨论】:

  • "11:20 GMT" 是正确的,假设您在 9 分钟前这样做了。现在是英国夏令时 11:20,也就是格林威治标准时间 10:20。第二个输出是正确的
  • @JonSkeet 是的,你是对的。问题应该反过来。更正...
  • 值得澄清的是,正如您在问题中所述,目前英国 不是 GMT 时区。英国有两个时区,GMT 和 BST。 GMT 与 UTC 相同,但在夏天说英国时区是 GMT 是不正确的。
  • @Chris,谢谢,已修改。
  • @Chris:在大多数表示中,英国有一个时区(例如“欧洲/伦敦”),它在一年中的不同时间观察到不同的 UTC 偏移量和缩写。我不知道“半时区”(例如 BST)的好名字,但我不会称它为时区。不,我根本不相信这是一个“事物名称不同”的问题 - 请参阅我的答案和文档。

标签: c# .net datetime


【解决方案1】:

这绝对不是错误,这是documented 的行为:

自定义格式字符串为"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"。使用此标准格式说明符时,格式化或解析操作始终使用不变区域性。

...

虽然 RFC 1123 标准将时间表示为协调世界时 (UTC),但格式化操作不会修改正在格式化的 DateTime 对象的值。因此,在执行格式化操作之前,您必须通过调用DateTime.ToUniversalTime 方法将DateTime 值转换为UTC。相反,DateTimeOffset 值会自动执行此转换;格式化操作前无需调用DateTimeOffset.ToUniversalTime方法。

正如我在对该问题的评论中指出的那样,格林威治标准时间 10:20 是正确的,假设您在提出问题前不久运行了代码:格林威治标准时间 11:20 尚未发生。

所以基本上,当您按照文档中的指导并致电ToUniversalTime 时,它会做正确的事。如果你不这样做,它会给出一个误导性的值 - 这很不幸,但它是 DateTimeIMO 的破坏设计的一部分。

您至少应该考虑使用DateTimeOffset,或者可能使用我的Noda Time 项目。

【讨论】:

  • 谢谢。实际上,我们已经考虑 Noda Time 有一段时间了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2015-02-22
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多