分析日期时间相对于输入字符串中提供的时区



我试图通过时区信息了解解析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类型。

最新更新