NodaTime - 时间切换后的错误

时间:2014-10-06 11:57:10

标签: 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 个答案:

答案 0 :(得分:1)

是的,它 意识到它是一个无效的本地时间 - 这就是为什么当你特别要求它将当地时间转换为UTC时,它会引发异常。它大致相当于调用Math.sqrt(-1)

InZoneStrictly调用你专门针对模糊或跳过的时间抛出异常。如果您使用InZoneLeniently,您将无法获得异常,但可能无法获得您想要的结果。或者,您可以使用LocalDateTime.InZone(DateTimeZone, ZoneLocalMappingResolver),这样您就可以根据需要映射无效的本地日期/时间值。

作为旁注:

  • 您的localTime变量是ZonedDateTime,因此名称有点误导
  • 您不需要致电SpecifyKind - ToDateTimeUtc将始终返回DateTime Utc,因此得名。