2015-12-09 14 views
5

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.

+0

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

+0

@ 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

+1

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

risposta

0

utcToLocalTime' e timeZoneFromSeries dal look del pacchetto timezone-series per essere stati sviluppati per coprire esattamente questo scenario.

Problemi correlati