当我为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
答案 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团队写了一篇关于这个话题的好博客