Qual è la migliore pratica per salvare TimeZones nel database?


12

Vogliamo iniziare a raccogliere fusi orari per ciascuno dei nostri indirizzi nel database. Qual è la migliore pratica per memorizzare i fusi orari? Come faresti per acquisire fusi orari per i record di indirizzi esistenti?

Sto usando Microsoft SQL Server, .net mvc, C #. Ogni suggerimento sarà molto apprezzato.



A proposito di un normale fuso orario il gotcha è di usare un int, ma alcuni fusi orari possono essere + o - 30 minuti, o anche 15 minuti :) Oh e ricorda che non è una scienza esatta, l'ora legale e così via può buttarti via.
Rocklan,

2
@LachlanB un modo per dirlo è che il fuso orario è più un luogo che un fuso orario . Ma anche questa visione non è abbastanza da sola, ad esempio la Russia ha recentemente cambiato la sua politica in materia di ora legale, il che significa che dovresti trattarla in modo diverso a seconda della data effettiva.
Daniel B,

Risposte:


7

Volete conservare qualcosa che non cambi continuamente (o due volte l'anno). Il database dei fusi orari https://en.wikipedia.org/wiki/List_of_tz_database_time_zones è esattamente la cosa giusta. Quindi memorizzi solo due lettere.

Da questo database è possibile richiedere la differenza di orario e quando è attiva l'ora legale. Non è solo la differenza di fuso orario, ma ti dà anche un'area, quindi molti luoghi alla stessa latitudine avranno codici diversi e possono cambiare individualmente le regole del fuso orario e il tuo software sarà in grado di gestirlo.

L'unica volta in cui è necessario apportare modifiche al database è quando una posizione cambia a quale fuso orario appartiene, il che sarebbe molto raro.


Nota che l'elenco su Wikipedia non contiene abbreviazioni di 2 caratteri per tutti i fusi orari IANA - inoltre la mappatura non è inequivocabile. Se hai bisogno di informazioni storiche complete, scegli invece i nomi completi.
Hulk,

2
Gli unici due codici di lettere che vedo nella pagina di Wikipedia sono i codici dei paesi. Questi non definiscono in modo univoco i fusi orari. Ad esempio, tutti i fusi orari negli Stati Uniti hanno lo stesso codice paese di due lettere: Stati Uniti. Allo stesso modo, in tutta l'Australia hanno il codice AU del paese.
Ian,

3

La migliore pratica assoluta sarebbe quella di utilizzare un database che supporti il TIMESTAMP WITH TIMEZONEtipo di dati definito da SQL99.

SQL Server ha un tipo chiamato datetimeoffsetche fa tutto ciò che TIMESTAMP WITH TIMEZONEpuò fare tranne memorizzare il fuso orario effettivo. Tutto quello che puoi fare è memorizzare un offset da UTC (ad esempio, 2013-05-04 12:34:56 -5:00), il che significa che dovrai determinarlo prima della memorizzazione in base al fuso orario.


3

Supponendo che tu stia utilizzando .Net framework 4.0 o versioni successive, TimeZoneInfo è ciò di cui hai bisogno.

Memorizzare tutti i valori di data nel database in formato UTC. Utilizzare il valore ID o il risultato di ToSerializedString () per ciascun client per creare un oggetto TimeZoneInfo per convertire le date memorizzate nel formato locale per la visualizzazione.


2

Hai detto che vuoi memorizzare un fuso orario per ogni indirizzo nel tuo DB, ma non hai detto cosa vuoi fare con esso. La memorizzazione di qualcosa in un DB è raramente fine a se stessa.

In ogni caso, cercherei di utilizzare il database TZ , noto anche come database Olsen, direttamente o utilizzando un software standardizzato che integra TZ. È possibile memorizzare un fuso orario semplicemente come una stringa per fare riferimento a una delle voci del DB TZ , ad esempio "Africa / Kampala" o "Europa / Parigi".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.