带有UTC日期的.NET的DateTime.ToString("R")中的错误?

Mau*_*Mau 2 .net c# datetime

我的总部设在英国(目前GMT + 1次).

如果我运行这个:

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

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

> DateTime.Now.ToString("R")
"Mon, 06 Oct 2014 11:20:00 GMT"
Run Code Online (Sandbox Code Playgroud)

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

"Mon, 06 Oct 2014 11:20:00"  // Or..
"Mon, 06 Oct 2014 11:20:00 BST"
Run Code Online (Sandbox Code Playgroud)

问题:这种行为是设计的吗?我可以获得与"R"格式相同的输出,但是使用正确的时区指示器吗?

Jon*_*eet 6

它绝对不是一个bug,它是记录在案的行为:

自定义格式字符串是"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,它做了正确的事情.当你不这样做时,它会产生一种误导性的价值 - 这是不幸的,但却是DateTimeIMO 破碎设计的一部分.

你应该考虑至少使用DateTimeOffset或者可能使用我的Noda Time项目.