TimeZoneInfo.ConvertTimeToUtc 对于某些 DateTime 值时调用异常
Posted
技术标签:
【中文标题】TimeZoneInfo.ConvertTimeToUtc 对于某些 DateTime 值时调用异常【英文标题】:Exception calling when TimeZoneInfo.ConvertTimeToUtc for certain DateTime values 【发布时间】:2011-01-25 20:44:07 【问题描述】:当我为这个特定的 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);
例外是:
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
【问题讨论】:
【参考方案1】:可以使用以下方法测试所讨论的时间是否无效
TimeZoneInfo.IsInvalidTime
或者如果使用不明确
TimeZoneInfo.IsAmbiguousTime
如果不明确,则可以从中检索到可以应用的时间数组
TimeZoneInfo GetAmbiguousTimeOffsets
在交互式应用程序的情况下,可以提示用户进行澄清。
BCL 团队就该主题写了一篇很好的博客
https://docs.microsoft.com/en-au/archive/blogs/bclteam/system-timezoneinfo-working-with-ambiguous-and-invalid-points-in-time-josh-free
【讨论】:
【参考方案2】:是的,完全正确。 1995 年 4 月 4 日中部标准时间不存在凌晨 2:55,因为挂钟skipped from 2am to 3am due to daylight saving transitions。这个例外似乎相当清楚。 (“标准”的使用在这里有些棘手;将其称为“中部时间”会更有意义,其中包括“中部标准时间”和“中部夏令时间”,但这是另一回事。哎呀,我更喜欢奥尔森自己识别...)
在其他时候,本地时间可能不明确 - 如果时钟回退一个小时(或更多!),那么本地时间可能会出现两次。
问题是:您希望您的代码在这种情况下表现如何?
有点不幸的是,异常只是ArgumentException
- 在Noda Time 中,我们将为这种确切的情况提供一个异常,以便更容易发现和捕获。 (我们还会有 IsAmbiguous 和 IsSkipped 之类的内容,因此您可以在不捕获异常的情况下进行检查。)
但基本信息是,这不是 BCL 中的错误 - 这是故意的。
【讨论】:
以上是关于TimeZoneInfo.ConvertTimeToUtc 对于某些 DateTime 值时调用异常的主要内容,如果未能解决你的问题,请参考以下文章