使用TimeZoneInfo.ConvertTimeToUtc(DateTime,TimeZoneInfo)方法在DST结束日期将时间从本地转换为UTC的问题

时间:2015-06-18 07:47:14

标签: c# .net datetime timezone

我有一个将本地时间转换为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);

1 个答案:

答案 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.IsAmbiguousTimeTimeZoneInfo.IsInvalidTime来检测由于时区转换而出现两次或零次的本地时间,然后再适当处理在你的应用程序中。