假设我有一个表示纪元时间的整数,例如 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)