当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团队写了一篇关于这个主题的好博客
- 错误(HttpWebRequest):要写入流的字节数超过指定的Content-Length字节大小
- 代码仅在调用Application.Run()WPF应用程序时启动
- AutoMapper for Func在选择器类型之间
- ServiceBus抛出401 Unauthorized Error
- TypeDescriptor.GetProperties()vs Type.GetProperties()
- 从sql server下载varbinary数据
- 如何在Windowsapp store应用中获取本地主机IP地址?
- 我应该在post或url中存储_method = PUT / DELETE
- 密码复杂性正则表达式与数字或特殊字符