2014-10-06 43 views
0

昨天乌拉圭改变它们的时钟,现在我一直看到异常转换特定的时候,他们的时区:NodaTime - 时间后,错误切换

ERROR Exception: - DateTime ConvertTimeToUtc(DateTime, String) (05/10/2014 02:31:00, America/Montevideo) 
NodaTime.SkippedTimeException: Specified argument was out of the range of valid values. 
Parameter name: Local time 05/10/2014 02:31:00 is invalid in time zone America/Montevideo 

我理解本地时间如何无效:

“例如,假设时区在凌晨2点前进,所以01:59:59之后的第二个时刻变为03:00:00,在这种情况下,当地时间(如02:30:00)不会发生。

但是,我不明白(而且我可能需要更多的咖啡),这就是为什么NodaTime没有考虑到这一点?是否应该知道02:31现在是一个无效的当地时间 - 或者我应该做额外的处理来解释这个吗?

功能我打电话:

var timeZone = DateTimeZoneProviders.Tzdb[timezoneName]; 
var localTime = LocalDateTime.FromDateTime(timeToConvert).InZoneStrictly(timeZone);; 
return DateTime.SpecifyKind(localTime.ToDateTimeUtc(), DateTimeKind.Utc); 

回答

1

是的,这知道,这是一个无效的本地时间 - 这就是为什么当你明确要求其到本地时间转换成UTC,它抛出一个例外。这大致相当于拨打Math.sqrt(-1)

您调用的InZoneStrictly明确地在模糊或跳过的时间内引发异常。如果你使用InZoneLeniently,你不会得到一个例外,但它可能不会给你你想要的结果。或者,您可以使用LocalDateTime.InZone(DateTimeZone, ZoneLocalMappingResolver),这将允许您根据需要映射无效的本地日期/时间值。

由于侧面说明:

  • localTime变量是ZonedDateTime,所以这个名字有点误导
  • 你不需要调用SpecifyKind - ToDateTimeUtc总是带着一种返回一个DateTimeUtc,因此得名。
+0

感谢您的回答约翰。我已经添加了我要调用的功能。我现在明白将本地时间转换为UTC时会出现错误,我应该做一些不同的事情来获得当地时间吗? – FBryant87 2014-10-06 12:45:05

+0

@ FBryant87:你真的不清楚你想达到什么,说实话 - 你从哪里得到timeToConvert?在某些情况下,它可能是合理的数据,例如如果你每天凌晨2:30有复发事件......那么你需要在凌晨2:30发生0或2次的一天中计算出这意味着什么。 – 2014-10-06 12:46:07

+0

谢谢,我认为你的更新答案解释了一点,我会在InZoneLeniently上阅读。 – FBryant87 2014-10-06 13:11:37