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 值时调用异常的主要内容,如果未能解决你的问题,请参考以下文章