Domanda

Devo archiviare in un database le regole di cambio dell'ora legale (ora legale) per le diverse regioni del mondo. Ho già un modo per memorizzare regioni e sottoregioni (quindi l'intero "La metà del problema con l'Australia" / Arizona / Navaho è risolto), ma mi chiedo quale sarebbe lo schema più efficiente per raggiungere questo obiettivo. Le due opzioni come le vedo io:

  • Avere una tabella che contiene una riga univoca per ogni anno e regione che indica l'ora di inizio e di fine dell'ora legale, nonché la compensazione specifica
  • Avere una tabella che memorizza una formula e un intervallo di date effettivi per ogni regione (intervallo effettivo richiesto per regioni come Israele)

Il vantaggio del primo è la flessibilità, dal momento che letteralmente qualsiasi cosa è possibile. Sfortunatamente, richiede anche (a) più spazio e, di conseguenza, (b) molto lavoro per ottenere l'input di dati. Il secondo è utile perché una riga potrebbe corrispondere a una regione per decenni, ma richiede anche una sorta di parser di linguaggio e interprete nel livello dell'applicazione. Dal momento che questo database verrà utilizzato da diverse applicazioni scritte in lingue senza potenti funzionalità di elaborazione del testo, preferirei evitare questa strada.

Mi piacerebbe usare solo zoneinfo o qualcosa del genere, ma sfortunatamente non è un'opzione in questo caso. Allo stesso modo, non posso normalizzare le date, il fuso orario e le informazioni sull'ora legale devono essere nel database per soddisfare determinati casi d'uso.

Qualcuno ha esperienza nel fare qualcosa di simile? Allo stesso modo, qualcuno ha delle opzioni brillanti che potrei aver perso?

È stato utile?

Soluzione

Sei praticamente condannato alla prima opzione. Puoi pre-generare date il più lontano possibile per i paesi che hanno " regole " per quanto riguarda i cambiamenti di tempo, ma alcune aree non hanno alcuna regola e i cambiamenti sono attuati o dalla dittatura fiat o dal voto legislativo annuale (il Brasile lo ha fatto fino a quest'anno).

Questo è il motivo per cui tutti i fornitori di sistemi operativi implementano le modifiche ai file del fuso orario una o due volte all'anno, perché devono farlo in modo programmatico al 100%.

Altri suggerimenti

Se le regole dell'ora legale devono essere nel database, probabilmente sceglierei di aggiornarle automaticamente da una fonte autorevole esterna (libreria, sito Web, qualunque cosa). Mantenere manualmente le regole dell'ora legale non sembra molto divertente.

Una delle migliori fonti di informazioni sulle regole del fuso orario è il database Olson, disponibile da elsie.nci.nih.gov . Nel settembre 2008, la versione corrente dei dati era tzdata2008f.tar.gz, la versione corrente del codice era tzcode2008e.tar.gz (e sì, il codice non veniva sempre rilasciato quando i dati lo erano). Questo tende ad essere la fonte di informazioni per molti altri sistemi (comprese, in particolare, le informazioni Oracle). C'è anche una mailing list disponibile. Come puoi vedere, ci sono state sei versioni dei dati finora nel 2008; Ho copie di 2005r, 2006l, 2007k in agguato sulla mia macchina, quindi le cose possono cambiare piuttosto frequentemente.

Oggi (marzo 2017), il database Olson è disponibile da IANA & # 8212; vedi https://iana.org/time-zones e ftp://ftp.iana.org/tz (in particolare ftp://ftp.iana.org/tz/releases ).

Esiste anche il Common Data Repository CLDR che contiene anche informazioni sui fusi orari.

Oracle DBMS lo gestisce automaticamente per te. La data è memorizzata in una rappresentazione interna (immaginiamo UMT per il bene dell'argomento) ed è formattata secondo le regole del fuso orario quando convertita in una stringa.

Questo risolve anche l'argomento su cosa fare durante il cambiamento nel tempo. OSSIA quando torni indietro l'orologio di 1/2 ora, in realtà ci sono 2 istanze di 3:25 dello stesso giorno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top