当前时间为Int

时间:2014-07-19 12:14:52

标签: haskell

我正在寻找一种方法来表示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,看起来不是正确答案。

2 个答案:

答案 0 :(得分:4)

使用Data.Time.Clock.POSIX包中的time模块:

main :: IO ()
main = print =<< getPOSIXTime

此函数返回PosixTime(在IO monad中),您可以使用roundfloor将其转换为Integer

答案 1 :(得分:1)

TL;博士

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

Live demo

这是如何工作的

要理解此解决方案,您只需阅读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由以下内容组成:

  • a Day(一天)
  • a DiffTime(午夜时间)

函数utctDayTime具有以下类型:

utctDayTime :: UTCTime -> DiffTime

即:它需要UTCTime并返回午夜的秒数。因此utctDayTime不计算当天。