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

时间:2010-03-10 11:28:32

标签: c# exception timezone

当我为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 

2 个答案:

答案 0 :(得分:25)

是的,这是绝对正确的。上午2:55在1995年4月4日的中央标准时间不存在,作为挂钟skipped from 2am to 3am due to daylight saving transitions。这个例外似乎相当清楚。 (使用“标准”在这里有点棘手;把它称为“中央时间”更有意义,其中包括“中央标准时间”和“中央日光时间”,但这是另一回事。哎呀,我更喜欢Olson自己标识......)

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

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

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

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

答案 1 :(得分:18)

可以使用

测试相关时间是否无效
TimeZoneInfo.IsInvalidTime

或者使用

是否含糊不清
TimeZoneInfo.IsAmbiguousTime

如果不明确,可以从

中检索可以应用的一系列时间
TimeZoneInfo GetAmbiguousTimeOffsets

对于交互式应用程序,可以提示用户进行说明。

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

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