Home > General Info, Programmazione > .NET: date, fusi orari e ora legale
Jun
28

Molto spesso, durante l’attività di programmazione, ci si trova a lavorare con un tipo di dato che può creare non pochi problemi: le date.

Fin quando abbiamo a che fare con date astratte (date storiche) o stiamo realizzando applicazioni che opereranno sempre all’interno di una Time Zone, il problema può anche non porsi e il classico tipo “DateTime” assolve egregiamente il suo compito.

Di recente tuttavia mi sono trovato a lavorare su un progetto per la realizzazione di un’applicazione distribuita in cui gli utenti:

  • accedono da time zone differenti;
  • manipolano dati che possono riferirsi a varie Time Zone.

In questo caso si presenta il problema non solo dei fusi orari ma anche del Daylight Saving che non tutte le time zone osservano. Il classico “DateTime” di conseguenza, memorizzando solamente l’ora locale, non è più in grado di fornirmi tutte le informazioni di cui ho bisogno e non mi permette di dedurre né in che fuso orario mi trovo e né se mi trovo in Daylight Saving Time.

La soluzione arriva da un nuovo tipo di dato, introdotto nel framework 3.5, che memorizza il tempo in formato UTC (Coordinated Universal Time) anziché come “Local Time”: DateTimeOffset.

worldzones

Il DateTimeOffset descrive il tempo al meridiano di Greenwith e non è influenzato dal Daylight Saving. Il local time viene memorizzato come una coppia di valori: il primo valore è l’ora UTC mentre il secondo è l’offset tra UTC e il local time.

Ad esempio le ore 3:15 in un fuso UTC + 1 verranno memorizzate come 4:15 + 01:00 mentre in un fuso orario UTC + 2 come 5:15 + 02:00. Questi due valori, sebbene indichino la stessa ora locale, descrivono 2 punti diversi nel tempo e possono facilmente essere distinte l’una dall’altra. Questo ci permette di gestire correttamente anche le transizioni di tempo legate al Daylight Saving.

In definitiva il tipo DateTime è utilizzabile per:

  • rappresentare solo valori di date (non di tempo);
  • rappresentare solo valori di tempo (non di date);
  • Lavorare con date astratte (date storiche);
  • Lavorare con DataBase o API che non supportano il tipo DateTimeOffset.

Viceversa, il DateTimeOffset va usato per:

  • Identificare univocamente un punto nel tempo;
  • Registrare degli eventi che si verificano in un determinato momento;
  • Eseguire operazioni aritmetiche con date e ore;
  • Lavorare con i fusi orari;
  • Lavorare con i Daylight Saving Times.

Per info dettagliate sull’utilizzo del tipo DateTimeOffset è possibile consultare il seguente link ufficiale.

, , , , ,

Add reply