如何使用纯函数可靠地将 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
,要么要求您为 EDT
或 EST
显式构造 TimeZone
。
我想避免依赖环境给我一个ZonedTime
,因为无法保证代码会在设置为美国东部时间的服务器上运行。所以使用这个功能是不可能的:
utcToLocalZonedTime :: UTCTime -> IO ZonedTime
因此,我可以选择自己构建必要的TimeZone
输入。
但是EDT
的TimeZone
与EST
的TimeZone
不同,所以我需要不同的TimeZone
,具体取决于夏令时是否有效。是否有一种简单的方法可以根据UTCTime
的值(即它是否属于夏令时)来生成EDT
或EST
的TimeZone
?
我想强调的是,我只想使用纯函数来完成这项工作。
也许我正在寻找 tzinfo library in Ruby 的 Haskell 模拟。
【问题讨论】:
因此,您需要传递所需的时区和 UTC 日期时间值,并接收一个设置了时区的值和小时调整为夏令时,基于你经过的区域? @9000 我很高兴能够获得美国东部时区中任何 UTCTime 的夏令时调整的 TimeZone 值。 粗略浏览资料让我认为该库假设EDT
和 EST
两个独立且不相关的时区,并且似乎没有 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 时间的主要内容,如果未能解决你的问题,请参考以下文章