Purtroppo non esiste una soluzione rapida per questo. L'internazionalizzazione di un'applicazione dovrebbe essere parte delle prime discussioni di progettazione, in quanto va davvero al centro di molte aree diverse, tra cui confronti di data / ora e formattazione dell'output.
Ad ogni modo, per essere sulla buona strada di Do It It Right, è essenziale memorizzare le informazioni sul fuso orario con il tempo . In altre parole, rendendosi conto che la data / ora 20130407 14:50
è insignificante senza (a) includendo l'offset UTC allora corrente del fuso orario (nota 1) , oppure (b) assicurando che tutta la logica che inserisce questi valori converta prima in un determinato offset fisso ( molto probabilmente 0). Senza una di queste cose, due valori di tempo dati sono incomparabili e i dati sono corrotti . (A proposito , quest'ultimo metodo sta giocando con il fuoco (nota 2) ; non farlo.)
In SQL Server 2008+, è possibile memorizzare l'offset con l'ora direttamente utilizzando il datetimeoffset
tipo di dati. (Per completezza, nel 2005 e prima, aggiungerei una seconda colonna per memorizzare il valore di offset UTC allora attuale (in minuti).)
Ciò semplifica un'applicazione di tipo desktop, poiché queste piattaforme normalmente dispongono di meccanismi per convertire automaticamente una data / ora + fuso orario in un'ora locale e quindi formattare per l'output, il tutto in base alle impostazioni internazionali dell'utente.
Per il Web, che è un'architettura intrinsecamente disconnessa, anche con i dati di back-end impostati correttamente, è più complesso perché sono necessarie informazioni sul client per poter eseguire la conversione e / o la formattazione. Questo di solito viene fatto tramite le impostazioni delle preferenze dell'utente (l'applicazione converte / formatta le cose prima dell'output) o semplicemente mostra le cose con lo stesso formato fisso e offset del fuso orario per tutti (che è ciò che attualmente fa la piattaforma Stack Exchange).
Puoi vedere come se i dati di back-end non sono impostati correttamente, molto rapidamente diventerà complicato e confuso. Non consiglierei di seguire nessuno di questi percorsi perché finirai con ulteriori problemi lungo la linea.
Nota 1:
L'offset UTC di un fuso orario non è fisso: considera l'ora legale in cui l'offset UTC di una zona varia di più o meno di un'ora. Anche le date dell'ora legale delle zone variano regolarmente. Quindi l'utilizzo datetimeoffset
(o un composto di local time
e UTC offset at that time
) porta al massimo recupero delle informazioni.
Nota 2:
Si tratta di controllare gli input di dati. Anche se non esiste un modo infallibile per convalidare i valori in entrata, è meglio applicare uno standard semplice che non comporti calcoli. Se un'API pubblica prevede un tipo di dati che include un offset, tale requisito sarà chiaro al chiamante.
In caso contrario, il chiamante deve fare affidamento sulla documentazione (se la legge) o il calcolo viene eseguito in modo errato, ecc. Esistono meno modalità di errore / bug quando si richiede un offset, in particolare per un sistema distribuito ( o anche solo web / database su server separati come il caso qui).
La memorizzazione dell'offset uccide comunque due uccelli con una fava; e anche se ciò non è richiesto ora , rende disponibile la possibilità in seguito, se necessario. È vero che occupa più spazio di archiviazione, ma penso che valga la pena compensare perché i dati vengono persi se non vengono mai registrati in primo luogo.