Sto utilizzando la libreria time-1.5.0.1
.Come convertire in modo affidabile POSIX epoch seconds in EST/EDT in modo affidabile, con funzioni pure
Viene assegnato un valore che rappresenta i secondi epoca, ad es. 1449590820
uguale a 2015-12-08 11:07:00 -0500
.
Utilizzando i moduli Data.Time, voglio essere in grado di convertire 1449590820
in un ZonedTime
.
La funzione che voglio usare è questo:
utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime
Il problema è sempre il valore TimeZone
ho bisogno. Le funzioni disponibili in Data.Time
dipendono dall'acquisizione di TimeZone
dall'ambiente o richiedono la creazione esplicita di TimeZone
per EDT
o EST
.
Voglio evitare di dipendere dall'ambiente per darmi un ZonedTime
, perché non c'è alcuna garanzia che il codice verrà eseguito su un server impostato sull'ora orientale degli Stati Uniti. Quindi, utilizzando questa funzione è fuori discussione:
utcToLocalZonedTime :: UTCTime -> IO ZonedTime
In modo che mi lascia con la possibilità di costruire la necessaria TimeZone
di ingresso me stesso.
Ma la TimeZone
per EDT
non è lo stesso del TimeZone
per EST
, quindi ho bisogno di un diverso TimeZone
a seconda che l'ora legale è in vigore. Esiste un modo semplice per generare un o EST
a seconda del valore di un UTCTime
(ad esempio se rientra nel periodo di ora legale)?
Voglio sottolineare che voglio farlo esclusivamente utilizzando le funzioni pure.
Forse sto cercando un analogo Haskell su tzinfo library in Ruby.
Quindi si desidera passare il fuso orario desiderato e un valore datetime UTC e ricevere un valore con il fuso orario impostato _and_ ora regolato per l'ora legale, in base alla zona che si è passato? – 9000
@ 9000 Sarei felice di essere in grado di ottenere il valore TimeZone corretto per il risparmio di luce diurna per qualsiasi UTCTime nel fuso orario degli Stati Uniti orientali. – dan
Un rapido sguardo alle fonti mi ha fatto pensare che la libreria supponga 'EDT' e' EST' due fusi orari separati e non correlati, e non sembra avere le informazioni di inizio/fine dell'ora legale che [tzdata] (https: //en.wikipedia .org/wiki/Tz_database) ha. Gli tzdata grezzi sono [disponibili] (https://hackage.haskell.org/package/tzdata) ma ancora grezzi, – 9000