我试图理解使用时区信息解析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出现错误?
答案 0 :(得分:1)
ISO 8601时间戳记中的偏移量描述了已经在本地时间部分中进行了 调整的UTC偏移量。因此:
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
从您的预期结果来看,我相信您希望null
在所有这三种情况下均为UTC值,但并非如此。
其他一些事情:
针对文化通过CultureInfo.CurrentCulture
与通过CultureInfo.InvariantCulture
相同。最好为ISO 8601时间戳传递DateTime
,因为当当前的文化使用非格里高里历系统时,它既可以提高性能,又可以防止错误。
在解析为DateTimeOffset
时,如果输入字符串中存在任何偏移,则结果将被调整为本地时区。原始偏移量将在转换中考虑在内,但不会保留。因此,在许多情况下,最好改用{{1}}类型。