2014-10-06 19 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