C# - DateTimeOffset rispetto a DateTime, perché usare gli offset?

C# - DateTimeOffset rispetto a DateTime, perché usare gli offset?

DateTime e DatimeTimeOffset sono molto simili. Entrambi sono costituiti da una data e un'ora, tuttavia un DateTimeOffset ha anche un offset, che definisce un offset rispetto all'ora UTC (Coordinated Universal Time).

Perché l'offset è importante? Bene, quando si persiste un DateTime in un database SQL non si può dire in quale fuso orario si trovava. Con DateTimeOffset avrai un offset che ti dice. Finché DateTime è un oggetto, ci sarà un DateTime.Kind che ti dice se è locale, UTC o non specificato, ma queste informazioni vengono perse con la persistenza.

Potresti avere la regola che memorizzi tutti i tuoi DateTime come UTC. Tuttavia ho spesso scoperto che le persone tendono a dimenticare. Spesso la regola è che devi usare DateTime.UtcNow invece di DateTime.Now. Facile vero? Ma per qualche ragione questo viene spesso dimenticato. Se memorizzi accidentalmente un DateTime in LocalTime nel tuo database, sarà un'ora diversa se lo recuperi come UTC.

Con DateTimeOffset non devi preoccuparti di questo. Anche se usi DateTimeOffset.Now otterrai un offset (+01:00 CET per esempio) che può identificare un'ora assoluta sulla terra. Se desideri ancora memorizzare le tue date in UTC, puoi utilizzare DateTimeOffset.UtcNow che ti darà un DateTimeOffset con l'offset di +00:00 (prendendo ovviamente in considerazione la tua ora locale attuale).

L'unico inconveniente di DateTimeOffset - a mio avviso - è che occupa 2 byte in più quando viene archiviato nel database.

Spero che questo ti abbia aiutato, fammi sapere nei commenti se lo ha fatto!