.NET中的错误';s DateTime.ToString(“R”)与UTC日期

本文关键字:日期 UTC ToString DateTime 错误 NET | 更新日期: 2023-09-27 18:25:37

我住在英国(目前格林尼治标准时间+1)。

如果我运行这个:

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

正确答案
如果我现在运行相同的,没有UTC日期时间转换:

> 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"格式相同的输出,但使用正确的时区指示器吗

.NET中的错误';s DateTime.ToString(“R”)与UTC日期

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

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

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

正如我在对这个问题的评论中所指出的,假设您在提问前不久运行了代码,那么10:20 GMT是正确的:11:20 GMT还没有发生。

因此,基本上,当您遵循文档中的指导并调用ToUniversalTime时,它会做正确的事情。如果你不这样做,它会给出一个误导性的值——这很不幸,但这是DateTime IMO.坏设计的一部分

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