我正在寻找一种方法来表示Haskell中的当前时间,就像在Ruby中一样:
Time.now.to_i
=> 1405771733
我试过了:
import Data.Time.Clock
currTime <- getCurrentTime
let timed = floor $ utctDayTime currTime :: Int -- 1
let timed = utctDayTime currTime :: Int -- 2
第一个表达式返回43774
,看起来不是正确答案。
答案 0 :(得分:4)
使用Data.Time.Clock.POSIX
包中的time
模块:
main :: IO ()
main = print =<< getPOSIXTime
答案 1 :(得分:1)
Ruby的#to_i
method返回自UNIX Epoch(1970年1月1日00:00 UTC)以来的秒数。您可以使用以下函数返回相同的数字:
secondsFromEpoch :: UTCTime -> Int
secondsFromEpoch utc =
let seconds = formatTime defaultTimeLocale "%s" utc
in read seconds
用作:
main :: IO ()
main = do
currentTime <- getCurrentTime
print $ secondsFromEpoch currentTime
要理解此解决方案,您只需阅读Date.Time.Format documentation,特别是formatTime
函数:
%S
Unix时代以来的整秒数。在Unix时代之前的时代,这是一个负数。请注意,在%s。%q和%s%Q中,小数是正数,而不是负数。例如,Unix纪元之前0.9秒格式化为-1.1%s%Q。
因此:
formatTime defaultTimeLocale "%s" utc
将返回字符串中的秒数。由于它是整数,我们可以使用read
并将其放入Int
。
UTCTime
由以下内容组成:
Day
(一天)DiffTime
(午夜时间)函数utctDayTime
具有以下类型:
utctDayTime :: UTCTime -> DiffTime
即:它需要UTCTime
并返回午夜的秒数。因此utctDayTime
不计算当天。