2010-03-10 20 views
21

Quando si esegue il codice per questo valore specifico di dt, viene generata un'eccezione quando si chiama il metodo ConvertTimeToUtc. mio TimeZoneID macchina locale è "GMT Standard Time"Chiamata di eccezione quando TimeZoneInfo.ConvertTimeToUtc per determinati valori DateTime

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

L'eccezione è:

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 

risposta

23

Sì, questo è assolutamente giusto. 2:55 non esisteva in Central Standard Time il 4 aprile 1995, come l'orologio da parete skipped from 2am to 3am due to daylight saving transitions. L'eccezione sembra abbastanza chiara a riguardo. (L'uso di "standard" è alquanto complicato qui, avrebbe più senso chiamarlo "Central Time" che includerebbe "Central Standard Time" e "Central Daylight Time", ma è una questione diversa. Identificativi Olson me stesso ...)

In altri momenti, l'ora locale può essere ambigua: se l'orologio va indietro un'ora (o più!), L'ora locale può verificarsi due volte.

La domanda è: come si desidera che il codice si comporti in questa situazione?

È un po 'sfortunato che l'eccezione sia solo ArgumentException - nel Noda Time avremo un'eccezione per questo caso esatto, in modo che sia più facile individuarlo e catturarlo. (Avremo anche qualcosa come IsAmbiguous e IsSkipped in modo da poter controllare senza rilevare un'eccezione.)

Ma il messaggio di base è che questo non è un bug nel BCL - è intenzionale.

17

si può verificare se il tempo in questione è valido utilizzando

TimeZoneInfo.IsInvalidTime 

o se non é ambigua usando

TimeZoneInfo.IsAmbiguousTime 

Se è ambiguo, un array di volte che potrebbe applicarsi può essere recuperato da

TimeZoneInfo GetAmbiguousTimeOffsets 

Nel caso di un'applicazione interattiva, l'utente può essere richiesto per r chiarimento.

Il team BCL ha scritto un buon blog sull'argomento

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

Problemi correlati