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

B4n*_*ndt 23 c# timezone exception

当我为dt的这个特定值运行代码时,当我调用ConvertTimeToUtc方法时会抛出异常.我的本地机器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);
Run Code Online (Sandbox Code Playgroud)

例外是:

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 
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 25

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

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

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

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

但基本的信息是,这不是BCL中的错误 - 这是故意的.


Eri*_* J. 18

可以测试使用的时间是否无效

TimeZoneInfo.IsInvalidTime
Run Code Online (Sandbox Code Playgroud)

或者如果使用不明确

TimeZoneInfo.IsAmbiguousTime
Run Code Online (Sandbox Code Playgroud)

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

TimeZoneInfo GetAmbiguousTimeOffsets
Run Code Online (Sandbox Code Playgroud)

在交互式应用程序的情况下,可以提示用户进行说明.

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

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