Nel FW 3.5 è presente una nuova classe per la gestione delle "zone temporali", la classe TimeZoneInfo.
Personalmente ritengo molto utile questa classe, che permette di manipolare efficacemente le date/ore provenienti da diversi server collocati in varie parti del mondo.
Un esempio molto carino può essere ben inquadrato dal seguente scenario: avete un server in California, e questo server deve marcare dei file con una data ben precisa, che deve essere espressa in "tempo italiano" (badate, tempo, non formato!!). Chiaramente, se in un web Service installato su questo server si invoca la DateTime.Now, si ottiene la data/ora espressa nella timezone in cui si trova il server. Ora, volendo riportare tale orario all'orario italiano, andremo incontro ad una serie di criticità:
- Ora legale/solare: essendo la data in un fuso diverso dal nostro, dovremmo conoscere come l'ora legale venga gestita in quella zona
- Intervallo temporale tra il fuso di destinazione e quello estero: dovremmo dare per scontato, o meglio, impostare nel file di configurazione, l'intervallo (in ore) che separa il fuso di destinazione e quello estero; in questo caso il problema nasce se in un secondo tempo si vuole spostare il server in una altra zona (cambio fuso)
Impiegando questa classe, è possibile esprimere gli orari in modo assolutamente automatico, usando l'accortezza di lavorare con la data/ora in formato UTC. In questo piccolo esempio possiamo vedere come la classe possa essere utilizzata per enumerare le timezone del sistema e come possa essere impiegata per convertire la data/ora in formato UTC in una data/ora nel formato della timezone desiderata.
1: namespace TimeZoneTest
2: {
3: class Program
4: {
5: static void Main(string[] args)
6: {
7: foreach (TimeZoneInfo _tzi in TimeZoneInfo.GetSystemTimeZones())
8: {
9: Console.WriteLine(string.Format("{0} {1}", _tzi.StandardName,TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,_tzi)));
10: }
11: Console.WriteLine();
12: Console.WriteLine(string.Format("West Europe Time: {0}",TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"))));
13: Console.WriteLine( string.Format("Pacific Time: {0}",TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"))));
14: Console.ReadLine();
15: }
16: }
17: }
Ovviamente, nel nostro caso, potremmo avere un metodo nella nostra Web Application che converte la data ora del server nella TimeZone desiderata a prescindere da dove questo si trovi, permettendo di fatto lo spostamento dell'applicazione su server collocati in qualunque parte del mondo.