C# 为某些日期时间值调用TimeZoneInfo.ConvertTimeToUtc时发生异常

C# 为某些日期时间值调用TimeZoneInfo.ConvertTimeToUtc时发生异常,c#,exception,timezone,C#,Exception,Timezone,当我为dt的这个特定值运行代码时,当我调用ConvertTimeToUtc方法时会引发一个异常。 我的本地机器时区ID是“GMT标准时间” 例外情况是: 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 th

当我为dt的这个特定值运行代码时,当我调用ConvertTimeToUtc方法时会引发一个异常。 我的本地机器时区ID是“GMT标准时间”

例外情况是:

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并不存在。关于这一点,例外情况似乎相当清楚。(这里“标准时间”的使用有点棘手;称之为“中央时间”更有意义,包括“中央标准时间”和“中央夏时制”,但那是另一回事。见鬼,我更喜欢奥尔森标识符自己……)

在其他时候,本地时间可能是不明确的——如果时钟倒转一小时(或更长!),那么本地时间可能出现两次

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

有点不幸的是,异常只是
ArgumentException
——在这种情况下,我们将有一个异常,以便更容易发现和捕获。(我们还将提供类似IsAmbiguous和IsSkiped的内容,以便您可以在不捕获异常的情况下进行检查。)


但最基本的信息是,这不是BCL中的错误,而是故意的。

可以使用

TimeZoneInfo.IsInvalidTime
或者如果使用

TimeZoneInfo.IsAmbiguousTime
如果不明确,可以从中检索可以应用的时间数组

TimeZoneInfo GetAmbiguousTimeOffsets
对于交互式应用程序,可以提示用户进行澄清

BCL团队就这个话题写了一篇很好的博客

TimeZoneInfo GetAmbiguousTimeOffsets