昨天乌拉圭改变了他们的时钟,现在我在为他们的时区转换特定时间时仍然看到异常:
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);
答案 0 :(得分:1)
是的,它 意识到它是一个无效的本地时间 - 这就是为什么当你特别要求它将当地时间转换为UTC时,它会引发异常。它大致相当于调用Math.sqrt(-1)
。
InZoneStrictly
调用你专门针对模糊或跳过的时间抛出异常。如果您使用InZoneLeniently
,您将无法获得异常,但可能无法获得您想要的结果。或者,您可以使用LocalDateTime.InZone(DateTimeZone, ZoneLocalMappingResolver)
,这样您就可以根据需要映射无效的本地日期/时间值。
作为旁注:
localTime
变量是ZonedDateTime
,因此名称有点误导SpecifyKind
- ToDateTimeUtc
将始终返回DateTime
Utc
,因此得名。