2009-02-23 3 views
79

Il .Net DateTime contiene informazioni sul fuso orario in cui è stato creato?Ottieni il fuso orario da DateTime

Ho una libreria che analizza DateTime da un formato che ha "+ zz" alla fine, e mentre analizza correttamente e regola l'ora locale, ho bisogno di ottenere quello che il fuso orario specifico era dall'oggetto DateTime.

È possibile? Tutto quello che posso vedere è DateTime.Kind, che specifica se l'ora è locale o UTC.

risposta

112

DateTime non contiene informazioni reali sul fuso orario. È può sapere se è UTC o locale, ma non quello che significa realmente locale.

DateTimeOffset è un po 'meglio - è fondamentalmente un tempo UTC e un offset. Tuttavia, non è ancora abbastanza per determinare il fuso orario, poiché molti diversi fusi orari possono avere lo stesso offset in qualsiasi momento. Questo suona come potrebbe essere abbastanza buono per te, come tutto quello che devi lavorare quando l'analisi della data/ora è l'offset.

Il supporto per i fusi orari di .NET 3.5 è molto migliore di quello che era, ma mi piacerebbe molto vedere uno "ZonedDateTime" standard o qualcosa del genere - un'ora UTC e un fuso orario effettivo. È facile crearne uno tuo, ma sarebbe bello vederlo nelle librerie standard.

EDIT: Quasi quattro anni più tardi, ora suggerirei di utilizzare Noda Time che ha un insieme piuttosto più ricco di tipi di data/ora. Sono di parte, però, come autore principale di Noda Time :)

+2

Il progetto PublicDomain su CodePlex fa questo per voi. – Cheeso

+0

Un enum TimeZone nel BCL sarebbe bello se i fusi orari del mondo sono statici e non cambiano. – jlafay

+1

@jlafay: Tuttavia, cambiano, ad esempio, sono stati aggiunti più fusi orari a Windows solo l'anno scorso. –

29

No.

Uno sviluppatore è responsabile di tenere traccia delle informazioni tempo-orario associato a un valore DateTime tramite qualche meccanismo esterno.

Una citazione da un eccellente articolo here. Da leggere per ogni sviluppatore .Net.

Quindi il mio consiglio è di scrivere una piccola classe di wrapper adatta alle vostre esigenze.

2

si potrebbe usare TimeZoneInfo classe

La classe TimeZone riconosce fuso orario locale, e può convertire volte tra il tempo universale coordinato (UTC) e l'ora locale. Un oggetto TimeZoneInfo può rappresentare qualsiasi fuso orario e i metodi della classe TimeZoneInfo possono essere utilizzati per convertire l'ora in un fuso orario nell'ora corrispondente in qualsiasi altro fuso orario. I membri della classe TimeZoneInfo supportano le seguenti operazioni:

  1. Recupero un fuso orario già definito dal sistema operativo .

  2. Enumerazione dei fusi orari disponibili su un sistema.

  3. Conversione tempi tra diversi fusi orari.

  4. Creazione di un nuovo fuso orario che non è già definito dal sistema operativo .

    Serializzazione di un fuso orario per il successivo recupero.

+1

... ma, dato un DateTime, non c'è ancora un modo per usare TimeZoneInfo per determinare il TimeZone di DateTime, per quanto ne so. –

+1

sì Jon Skeet ha ragione su questo – Shekhar