假设我有一个表示纪元时间的整数,例如 epoch = 1499055085 ,我想在 Haskell 中将其转换为 UTCTime
我怎样才能做到这一点?

在其他语言中,这是一项非常微不足道的任务,为什么在 haskell 中如此困难?

最佳答案

谁说难?

您可以简单地使用 fromIntegral :: (Integral a, Num b) => a -> b 将纪元(整数)转换为 POSIXTime

接下来我们可以使用 posixSecondsToUTCTime :: POSIXTime -> UTCTime 获取 UTCTime ,最后我们使用 utctDay :: UTCTime -> Day 获取 UTCTime 的日期部分。

如果你想要一个 (year,month,day) 元组,我们可以使用 toGregorian :: Day -> (Integer,Int,Int) 方法。

所以我们可以使用下面的方法:

import Data.Time.Calendar(toGregorian)
import Data.Time.Clock(utctDay,UTCTime)
import Data.Time.Clock.POSIX(posixSecondsToUTCTime)

epochToUTC :: Integral a => a -> UTCTime
epochToUTC = posixSecondsToUTCTime . fromIntegral

epochToGregorian :: Integral a => a -> (Integer,Int,Int)
epochToGregorian = toGregorian . utctDay . epochToUTC

然后例如:
Main> epochToGregorian 1234567
(1970,1,15)
Main> epochToGregorian 123456789
(1973,11,29)
Main> epochToGregorian 1234567890
(2009,2,13)

10-06 14:57