在使用 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法



我有一个应用程序,可以将本地时间转换为UTC并将其存储在数据库中。我在测试特定日期的转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟在到达凌晨 2.00 时回到凌晨 1.00 点))。

我的本地系统时区是(UTC-08:00)太平洋时间(美国和加拿大)我将时间 2015-10-31 01:49:00.000 转换为 UTC,输出为 2015-10-31 08:49:00.000。

当我尝试将 2015-11-01 01:49:00.000 转换为 UTC 时,输出为 2015-10-31 09:49:00.000。

这不是错吗? 为什么转换后的时间在 11 月 1 日增加了一个小时?

这是我的方法,

DateTime universalFormatDateTime = localDateTime.Value.GetUniversalFormatDateTime();
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(universalFormatDateTime, _timeZoneInfo);

这不是错吗? 为什么转换后的时间在 11 月 1 日增加了一个小时?

因为正如你所说,那是时钟改变的时候。

问题是"2015-11-01 01:49:00.000"在太平洋时间是模棱两可的 - 它出现了两次,一次在2015-11-01T08:49:00Z,一次在2015-11-01T09:49:00Z。

DateTime可以记住你的意思是哪一个,但这取决于你是如何想出这个值的。如果你只是从某处的文本中解析了它,你基本上没有足够的信息 - 它没有指定一个时刻。

如果你改用我的 Noda 时间库,那么在从LocalDateTime转换为ZonedDateTime时,你可以指定你希望如何处理歧义 - 所以这可能是你的一个选择......但这取决于值来自哪里,以及您是否知道它总是第二次出现还是总是第一次出现。

如果仍要使用 TimeZoneInfo ,可以使用 TimeZoneInfo.IsAmbiguousTimeTimeZoneInfo.IsInvalidTime 来检测由于时区偏移而出现两次或零次的本地时间,然后在应用中适当地处理这些时间。

相关内容

  • 没有找到相关文章

最新更新