.NET的日期时间.ToString(" R")与UTC日期的错误?

时间:2014-10-06 10:27:45

标签: c# .net datetime

我的总部设在英国(目前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”格式相同的输出,但是使用正确的时区指示符吗?

1 个答案:

答案 0 :(得分:6)

这绝对不是一个错误,它是documented行为:

  

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

     

...

     

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

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

所以基本上,当你按照文档中的指导并致电ToUniversalTime时,它会做正确的事情。当你不这样做时,它会产生一种误导性的价值 - 这是不幸的,但却是DateTime IMO破碎设计的一部分。

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