2015-12-09 7 views
5

Ich verwende die time-1.5.0.1-Bibliothek.So konvertieren Sie POSIX-Epochensekunden zuverlässig in EST/EDT-Zeit, mit reinen Funktionen

Ich habe einen Wert gegeben, der Epochensekunden darstellt, z. 1449590820 was entspricht 2015-12-08 11:07:00 -0500.

Mit Data.Time Module, ich möchte 1449590820 zu einem ZonedTime konvertieren können.

Die Funktion ich verwenden möchte, ist dies:

utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime 

Das Problem der TimeZone Wert wird immer ich brauche. Die verfügbaren Funktionen in hängen entweder davon ab, die TimeZone aus der Umgebung zu erhalten, oder erfordern, dass Sie explizit eine TimeZone für EDT oder erstellen.

Ich möchte je nach Umgebung vermeiden, mir ZonedTime zu geben, weil es keine Garantie gibt, dass der Code auf einem Server ausgeführt wird, der auf die US Eastern Time eingestellt ist. So mit dieser Funktion ist aus der Frage:

utcToLocalZonedTime :: UTCTime -> IO ZonedTime 

Damit lässt mich mit der Möglichkeit des Aufbaus der notwendigen TimeZone Eingang selbst.

Aber die TimeZone für EDT ist nicht das gleiche wie die TimeZone für EST, so brauche ich eine anderes TimeZone je nachdem, ob in der Tat Tageslichtsparungen ist. Gibt es eine einfache Möglichkeit, eine TimeZone von EDT oder abhängig von dem Wert einer UTCTime zu generieren (d. H. Ob es innerhalb der Sommerzeit liegt)?

Ich möchte betonen, dass ich dies ausschließlich mit reinen Funktionen tun möchte.

Vielleicht suche ich nach einem Haskell-Analog zur tzinfo library in Ruby.

+0

Sie möchten also die gewünschte Zeitzone und einen UTC-Datetime-Wert übergeben und erhalten einen Wert mit der für die Sommerzeit angepassten Zeitzone _und_Stunden, basierend auf der Zone, die Sie bestanden haben? – 9000

+0

@ 9000 Ich würde mich freuen, wenn ich nur den für die Sommerzeit angepassten TimeZone-Wert für jede UTCTime in der Eastern Time Zone der USA erhalten könnte. – dan

+1

Ein flüchtiger Blick durch Quellen ließ mich denken, dass die Bibliothek "EDT" und "EST" zwei getrennte und nicht verwandte Zeitzonen annimmt, und scheint nicht die DST Start/End Info zu haben, die [tzdata] (https: //en.wikipedia .org/wiki/Tz_database) hat. Raw tzdata sind [verfügbar] (https://hackage.haskell.org/package/tzdata), aber immer noch roh, – 9000

Antwort

0

utcToLocalTime' und timeZoneFromSeries aus dem Paket timezone-series aussehen, wurden entwickelt, um genau dieses Szenario zu decken.

Verwandte Themen