如何使用纯函数可靠地将 POSIX 纪元秒转换为 EST/EDT 时间

Posted

技术标签:

【中文标题】如何使用纯函数可靠地将 POSIX 纪元秒转换为 EST/EDT 时间【英文标题】:How to convert POSIX epoch seconds to EST/EDT time reliably, with pure functions 【发布时间】:2016-03-15 02:21:19 【问题描述】:

我正在使用time-1.5.0.1 库。

我得到一个代表纪元秒的值,例如1449590820 等于 2015-12-08 11:07:00 -0500

使用Data.Time 模块,我希望能够将1449590820 转换为ZonedTime

我要使用的功能是这样的:

utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime

问题是获取我需要的TimeZone 值。 Data.Time 中的可用函数要么依赖于从环境中获取 TimeZone,要么要求您为 EDTEST 显式构造 TimeZone

我想避免依赖环境给我一个ZonedTime,因为无法保证代码会在设置为美国东部时间的服务器上运行。所以使用这个功能是不可能的:

utcToLocalZonedTime :: UTCTime -> IO ZonedTime

因此,我可以选择自己构建必要的TimeZone 输入。

但是EDTTimeZoneESTTimeZone 不同,所以我需要不同的TimeZone,具体取决于夏令时是否有效。是否有一种简单的方法可以根据UTCTime 的值(即它是否属于夏令时)来生成EDTESTTimeZone

我想强调的是,我只想使用纯函数来完成这项工作。

也许我正在寻找 tzinfo library in Ruby 的 Haskell 模拟。

【问题讨论】:

因此,您需要传递所需的时区和 UTC 日期时间值,并接收一个设置了时区的值小时调整为夏令时,基于你经过的区域? @9000 我很高兴能够获得美国东部时区中任何 UTCTime 的夏令时调整的 TimeZone 值。 粗略浏览资料让我认为该库假设 EDTEST 两个独立且不相关的时区,并且似乎没有 tzdata 具有的 DST 开始/结束信息.原始 tzdata 是 available 但仍然是原始的, 是的,看来我正在寻找 Haskell 中的 tzdata/tzinfo 支持。 我正在看这个:hackage.haskell.org/package/tz 【参考方案1】:

tz 包看起来可能符合要求,但不幸的是,它有 dependency build problems。

【讨论】:

【参考方案2】:

timezone-series 包中的utcToLocalTime'timeZoneFromSeries 看起来已经开发用于完全涵盖这种情况。

【讨论】:

以上是关于如何使用纯函数可靠地将 POSIX 纪元秒转换为 EST/EDT 时间的主要内容,如果未能解决你的问题,请参考以下文章

将mysql DATETIME列转换为纪元秒

如何将日期时间(在特定时区)转换为纪元秒

可靠地将任何对象转换为字符串,然后再返回

如何使用 sed 将纪元转换为人类可读的日期时间

在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]

是否有 perl 5.005 核心模块可以将纪元秒数转换为日期时间字符串?