Quest'oggi avevo la necessità di convertire un orario in formato UTC, prelevato da un database, nell'orario locale. Il tipo DateTime mette a disposizione un metodo, ToLocalTime, che sembra perfetto per questo scopo. Tuttavia, il suo utilizzo "diretto" non porta il risultato sperato.
Il motivo è semplice: se leggo un campo datetime da un database e lo salvo in una variabile DateTime, .NET suppone che tale orario sia espresso nel formato locale, quindi se su tale variabile invoco il metodo ToLocalTime, ottengo di nuovo l'orario originale.
Per ottenere il risultato voluto, è necessario utilizzare un'istruzione come la seguente:
var localDatetime = new DateTime(utcDateTimeFromDB.Ticks, DateTimeKind.Utc).ToLocalTime();
Con essa, creiamo un nuovo oggetto DateTime, ma, tramite il parametro DateTimeKind.Utc, indichiamo che l'orario è in formato UTC. Così facendo, il metodo ToLocalTime è in grado di applicare il fuso orario e l'eventuale ora legale, per ottenere l'orario locale corretto.