为什么DateTime.Now.ToString(“u”)不起作用?

时间:2009-05-27 13:27:48

标签: c# .net vb.net datetime utc

我目前在British summer time,即UTC +1小时。我通过以下代码确认我的PC是正确的,它返回true。

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

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

DateTime.Now.ToString("u")

它按照预期返回UTC格式的当前系统日期,但结尾的Z(Zulu Time)不是+01:00?

2009-05-27 14:21:22Z

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

这是正确的功能吗?

3 个答案:

答案 0 :(得分:21)

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");

答案 1 :(得分:7)

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

  

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

     

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

     

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

答案 2 :(得分:3)

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