我目前在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
这是正确的功能吗?
答案 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”)。