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

Joh*_*ohn 11 .net c# vb.net datetime utc

我目前在英国夏令时,即UTC +1小时.我通过以下代码确认我的PC是正确的,它返回true.

System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(Date.Now)
Run Code Online (Sandbox Code Playgroud)

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

DateTime.Now.ToString("u")
Run Code Online (Sandbox Code Playgroud)

它按照预期以UTC格式返回如下的确切当前系统日期,但结尾的Z(祖鲁时间)不是+01:00?

2009-05-27 14:21:22Z
Run Code Online (Sandbox Code Playgroud)

2009-05-27 14:21:22+01:00
Run Code Online (Sandbox Code Playgroud)

这是正确的功能吗?

Pat*_*ald 21

MSDN声明如下:

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

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

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

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

DateTime.UtcNow.ToString("u")
Run Code Online (Sandbox Code Playgroud)

要么

DateTime.Now.ToUniversalTime().ToString("u")
Run Code Online (Sandbox Code Playgroud)

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

DateTime.Now.ToString("yyyy-MM-dd HH:mm:sszzz");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 我应该阅读文档! (3认同)
  • 这也有效:`DateTime.UtcNow.ToString("u");` (2认同)

Row*_*haw 7

"u"是通用可排序的日期/时间模式,而不是UTC格式; 引用文档:

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

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

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