我试图通过时区信息了解解析UTC时间,但是我的代码给我带来了奇怪的结果,或者至少我不了解。
var utcTime = DateTime.Parse("2019-05-20T13:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
// utcTime = {5/20/2019 1:00:00 PM} (its kind is Utc and this is accepted)
var zonedTime1 = DateTime.Parse("2019-05-20T13:00:00-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime1 = {5/20/2019 1:00:00 PM} (its kind is Local, but I was expecting {5/20/2019 9:00:00 AM} with Local kind)
var zonedTime2 = DateTime.Parse("2019-05-20T13:00:00+04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime2 = {5/20/2019 5:00:00 AM} (its kind is Local, but I was expecting {5/20/2019 5:00:00 PM} with Local kind)
我想知道我要在哪里出错或我的期望是错误的。如果正确解析了UTCTIME,那么为什么ZonedTime1和ZonedTime2不正确?
ISO 8601时间戳中的偏移描述了在本地时间部分中已调整已经调整的UTC的偏移。因此:
-
2019-05-20T13:00:00-04:00
=2019-05-20T17:00:00Z
=2019-05-20T13:00:00-04:00
-
2019-05-20T13:00:00+04:00
=2019-05-20T09:00:00Z
=2019-05-20T05:00:00-04:00
根据您的预期结果,我相信您打算在所有三种情况下将13:00:00
成为UTC值,但不是。
其他几件事:
-
传递培养物的
null
与通过CultureInfo.CurrentCulture
相同。最好是通过CultureInfo.InvariantCulture
for ISO 8601时间戳,因为当当前文化使用非gregorian日历系统时,它既可以提高性能,又可以防止错误。 -
解析到
DateTime
时,如果输入字符串中存在任何偏移量,则结果将调整到本地时区。原始偏移将在转换中考虑到,但不会保留。因此,在许多情况下,您最好使用DateTimeOffset
类型。