我有一个应用程序,可以将本地时间转换为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.IsAmbiguousTime
和 TimeZoneInfo.IsInvalidTime
来检测由于时区偏移而出现两次或零次的本地时间,然后在应用中适当地处理这些时间。