当TimeZoneInfo.ConvertTimeToUtc为某些DateTime值时调用exception

当我为这个特定的dt值运行代码时,当我调用ConvertTimeToUtc方法时会抛出exception。 我的本地机器timeZoneId是“GMT标准时间”

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var dt = new DateTime(1995, 4, 2, 2, 55, 0); var t = TimeZoneInfo.ConvertTimeToUtc(dt, tzi); 

例外是:

 System.ArgumentException was unhandled Message="The supplied DateTime represents an invalid time. For example, when the clock is adjusted forward, any time in the period that is skipped is invalid.\r\nParameter 

是的,这是绝对正确的。 1995年4月4日中部标准时间凌晨2点55分, 由于夏令时过渡,挂钟从早上2点跳到凌晨3点 。 这个例外似乎相当清楚。 (使用“标准”在这里有点棘手;把它称为“中央时间”更有意义,其中包括“中央标准时间”和“中央日光时间”,但这是另一回事。哎呀,我更喜欢奥尔森标识自己…)

在其他时候,当地时间可能不明确 – 如果时钟返回一小时(或更长时间!),则本地时间可能会发生两次。

问题是:您希望代码在这种情况下如何表现?

有点不幸的是,exception只是ArgumentException – 在Noda Time中我们将对这个确切的情况有一个例外,因此更容易发现和捕获。 (我们也会有类似IsAmbiguous和IsSkipped的东西,所以你可以检查而不会发现exception。)

但基本的信息是,这不是BCL中的一个错误 – 这是故意的。

可以使用来测试所讨论的时间是否无效

 TimeZoneInfo.IsInvalidTime 

或者如果使用不明确

 TimeZoneInfo.IsAmbiguousTime 

如果它不明确,可以从中检索可以应用的一系列时间

 TimeZoneInfo GetAmbiguousTimeOffsets 

在交互式应用程序的情况下,可以提示用户澄清。

BCL团队写了一篇关于这个主题的好博客

http://blogs.msdn.com/b/bclteam/archive/2007/06/11/system-timezoneinfo-working-with-ambiguous-and-invalid-points-in-time-josh-free.aspx