Utc时间和本地时间的区别

4

这两者产生了相同的结果,但我原本期望它们会相差6个小时。我不明白的是什么?


Console.WriteLine(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKind.Utc).ToString("R"));
\\ Thu, 01 Jan 1970 12:01:00 GMT

Console.WriteLine(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKind.Local).ToString("R"));
\\ Thu, 01 Jan 1970 12:01:00 GMT

5
试试这个:(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKind.Local)).ToUniversalTime().ToString("R") - ProgrammingLlama
2
@john 这就是为什么 NodaTime 存在的原因 :) 它更加明确地执行操作。 - Mafii
如果您使用O作为格式化程序,则第二个时区将显示“正确”的时区。 - xanatos
2个回答

6

ToString 方法会直接输出 DateTime 对象。如果要查看两个时间之间的差异,需要将它们转换为相同的时区。可以使用 .ToUniversalTime() 方法进行转换。

Console.WriteLine(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKind.Utc).ToUniversalTime().ToString("R"));
// Thu, 01 Jan 1970 12:01:00 GMT

Console.WriteLine(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKind.Local).ToUniversalTime().ToString("R"));
// Thu, 01 Jan 1970 11:01:00 GMT <-- I am at GMT+1

1
唯一的例外似乎是 O,它是往返格式。它以智能的方式工作。 - xanatos

1

这与您使用的格式有关。

根据Microsoft文档:

"R"或"r"标准格式说明符表示由DateTimeFormatInfo.RFC1123Pattern属性定义的自定义日期和时间格式字符串。该模式反映了一个定义的标准,而且该属性是只读的。因此,无论使用的文化或提供程序格式如何,它总是相同的。自定义格式字符串为“ddd,dd MMM yyyy HH:mm:ss 'GMT'”。当使用此标准格式说明符时,格式化或解析操作始终使用不变的文化。

编辑:“R”或“r”格式并未说明显示的时间为UTC时间。它只是说它们使用格式“ddd,dd MMM yyyy HH:mm:ss 'GMT'”。GMT字符串有点令人困惑,但在这里只是一个没有意义的字符串...


1
这与你使用的格式有关。不完全是这样。如果您使用依赖于文化的格式,例如 g,则仍然会看到相同的时间。 - Patrick Hofman
谁说"g"格式显示UTC时间了?"R"格式和"r"格式也不是。"GMT"字符串有些令人困惑。 - sheep
好的。那么从你的回答中并不清楚。你可能需要澄清一下。 - Patrick Hofman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接