2010-03-10 23 views
21

Wenn ich den Code für diesen bestimmten Wert von dt ausführen, wird beim Aufruf der ConvertTimeToUtc-Methode eine Ausnahme ausgelöst. meine lokale Maschine TimeZoneID ist "GMT Standard Time"Ausnahme beim Aufruf von TimeZoneInfo.ConvertTimeToUtc für bestimmte DateTime-Werte

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
var dt = new DateTime(1995, 4, 2, 2, 55, 0); 
var t = TimeZoneInfo.ConvertTimeToUtc(dt, tzi); 

Die Ausnahme ist:

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 

Antwort

23

Ja, das ist absolut richtig. 2:55 Uhr gab es am 4. April 1995 in der Central Standard Time nicht als die Wanduhr skipped from 2am to 3am due to daylight saving transitions. Die Ausnahme scheint ziemlich klar zu sein. (Die Verwendung von "Standard" ist hier etwas schwierig, es wäre sinnvoller, sie als "Zentrale Zeit" zu bezeichnen, die "Zentrale Standardzeit" und "Zentrale Sommerzeit" einschließt. Aber das ist eine andere Sache. Heck, würde ich bevorzugen Olson-Kennungen selbst ...)

Zu anderen Zeiten kann eine Ortszeit mehrdeutig sein - wenn die Uhr zurück eine Stunde (oder mehr!) Dann kann eine Ortszeit zweimal auftreten.

Die Frage ist: Wie soll Ihr Code in dieser Situation verhalten?

Es ist etwas bedauerlich, dass die Ausnahme nur ArgumentException ist - in Noda Time werden wir eine Ausnahme für diesen genauen Fall haben, so dass es leichter zu erkennen und zu fangen ist. (Wir haben auch etwas wie IsAmbiguous und IsSkipped, so dass Sie überprüfen können, ohne eine Ausnahme zu fangen.)

Aber die grundlegende Nachricht ist, dass dies kein Fehler in der BCL ist - es ist absichtlich.

17

Man kann prüfen, ob die fraglichen Zeit ungültig ist

TimeZoneInfo.IsInvalidTime 

verwenden oder wenn es nicht eindeutig ist

TimeZoneInfo.IsAmbiguousTime 

mit der Wenn es nicht eindeutig ist, kann eine Reihe von Zeiten, die zutreffen könnten abgerufen werden von

TimeZoneInfo GetAmbiguousTimeOffsets 

Bei einer interaktiven Anwendung kann der Benutzer dazu aufgefordert werden r Klärung.

Die BCL-Team hat einen guten Blog über das Thema

http://blogs.msdn.com/b/bclteam/archive/2007/06/11/system-timezoneinfo-working-with-ambiguous-and-invalid-points-in-time-josh-free.aspx

Verwandte Themen