根据输入字符串

时间:2019-05-20 18:31:37

标签: c# datetime utc

我试图理解使用时区信息解析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出现错误?

1 个答案:

答案 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}}类型。