Haskell将时间毫秒转换为UTCTime

时间:2015-10-14 05:21:15

标签: haskell time

自1970-01-01 00:00 UTC以来,我的时间为毫秒。 如何将其转换为UTCTime(整数 - > UTCTime)? 我需要UTCTime将其插入MongoDB。

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是如何创建UTCTime并为其添加一些秒数:

import Data.Time.Calendar
import Data.Time.Clock

-- 1/1/1900 as a Day
jan_1_1900_day = fromGregorian 1900 1 1 :: Day

-- 1/1/1900 as a UTCTime
jan_1_1900_time = UTCTime jan_1_1900_day 0

secs = 86400+3600  -- number of seconds to add to 1/1/1900
                   -- = 1 day + 1 hour

-- add some seconds to 1/1/1900 00:00:00
myTime = addUTCTime (fromIntegral secs) jan_1_1900_time

showTime t = (utctDay t, utctDayTime t) -- to see inside a UTCTime

main = do
  print $ showTime jan_1_1900_time
  print $ showTime myTime

输出结果为:

(1900-01-01,0s)
(1900-01-02,3600s)

addUTCTime的第一个参数是NominalDiffTime,它同时包含Num实例和Enum实例。

使用Num实例,fromIntegral x将创建x秒的NominalDiffTime。

使用Enum实例,toEnum x将创建x皮秒的NominalDiffTime。

因此,如果你想要毫秒级的分辨率,你可以使用这个方法:

millis = (2*86400+3600)*1000  -- milliseconds to add = 2 days + 1 hour

myTime' = addUTCTime (toEnum (millis*10^9)) jan_1_1900_time

然后print $ showtime myTime'导致:

(1900-01-03,3600s)

答案 1 :(得分:1)

您可以使用Data.Time.Clock.POSIX中的posixSecondsToUTCTime功能。由于您的值以毫秒为单位,因此您需要先将其除以1000。这是一个例子:

import Data.Time.Clock.POSIX
import Data.Time.Clock.UTC

millisToUTC :: Integer -> UTCTime
millisToUTC t = posixSecondsToUTCTime $ (fromInteger t) / 1000