我有一个将本地时间转换为UTC并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015年11月1日(夏令时结束的日期(时钟在凌晨2点返回到凌晨1点))。
我的本地系统时区是(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);
答案 0 :(得分:2)
这不是错的吗?为什么转换时间在11月1日增加了一个小时?
因为当时钟发生变化时,就像你说的那样。
问题是“2015-11-01 01:49:00.000”在太平洋时间不明确 - 它发生两次,一次是在2015-11-01T08:49:00Z,一次是在2015-11-01T09:49 :00Z
DateTime
can remember which of those you mean,但这取决于您如何提出该值。如果你刚从某个地方的文本中解析了这个,你基本上没有足够的信息 - 它没有及时指定一个瞬间。
如果您要使用我的Noda Time库,那么在从LocalDateTime
转换为ZonedDateTime
时,您可以指定您希望如何处理歧义 - 以便< em> may 可以作为你的选择...但它取决于值的来源,以及你是否知道总是第二次出现或总是第一个。
如果您仍想使用TimeZoneInfo
,则可以使用TimeZoneInfo.IsAmbiguousTime
和TimeZoneInfo.IsInvalidTime
来检测由于时区转换而出现两次或零次的本地时间,然后再适当处理在你的应用程序中。