12

我目前处于英国夏令时,即 UTC +1 小时。我用以下代码确认我的电脑是正确的,它返回 true。

System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(Date.Now)

那么我的问题是为什么 UTC 格式化程序不能像我预期的那样工作:

DateTime.Now.ToString("u")

它按预期以 UTC 格式返回准确的当前系统日期,但最后的 Z(祖鲁时间)不是 +01:00?

IE

2009-05-27 14:21:22Z

不是

2009-05-27 14:21:22+01:00

这是正确的功能吗?

4

3 回答 3

23

MSDN 声明如下:

表示由 DateTimeFormatInfo.UniversalSortableDateTimePattern 属性定义的自定义日期和时间格式字符串。该模式反映了定义的标准,并且该属性是只读的。因此,无论使用的文化或提供的格式提供程序如何,它总是相同的。自定义格式字符串为“yyyy'-'MM'-'dd HH':'mm':'ss'Z'”。

使用此标准格式说明符时,格式化或解析操作始终使用不变区域性。

格式化不会转换日期和时间对象的时区。因此,应用程序必须在使用此格式说明符之前将日期和时间转换为协调世界时 (UTC)。

在格式化之前,您应该使用以下代码将当前日期转换为 UTC:

DateTime.UtcNow.ToString("u")

或者

DateTime.Now.ToUniversalTime().ToString("u")

要以您期望的格式显示(即 2009-05-27 14:21:22+01:00),您需要使用自定义日期格式:

DateTime.Now.ToString("yyyy-MM-dd HH:mm:sszzz");
于 2009-05-27T13:32:55.933 回答
7

“u”是通用可排序日期/时间模式,不是 UTC 格式;引用文档

表示由 DateTimeFormatInfo..::.UniversalSortableDateTimePattern 属性定义的自定义日期和时间格式字符串。该模式反映了定义的标准,并且该属性是只读的。因此,无论使用的文化或提供的格式提供程序如何,它总是相同的。自定义格式字符串为“yyyy'-'MM'-'dd HH':'mm':'ss'Z'”。

使用此标准格式说明符时,格式化或解析操作始终使用不变区域性。

格式化不会转换日期和时间对象的时区。因此,应用程序必须在使用此格式说明符之前将日期和时间转换为协调世界时 (UTC)。

于 2009-05-27T13:33:37.680 回答
4

您需要使用 DateTime.Now.ToUniversalTime().ToString("u")。

于 2009-05-27T13:39:56.013 回答