以Int为单位获取Unix / Epoch时间

时间:2013-07-28 15:25:07

标签: haskell

haskell中是否有一个函数用于纪元时间,以秒/毫秒为单位?

也许类似于java的

System.currentTimeMillis();

编辑:IntInteger

6 个答案:

答案 0 :(得分:35)

getCurrentTime :: IO UTCTime

UNIX纪元时间可以像Int那样检索:

> :m + Data.Time System.Locale Control.Applicative
> epoch_int <- (read <$> formatTime defaultTimeLocale "%s" <$> getCurrentTime) :: IO Int
> epoch_int
1375025861

UPD :正如其他用户所注意到的那样,有更简单的方法:

> :m + Data.Time.Clock.POSIX
> round `fmap` getPOSIXTime 
1375040716
it :: Integer

答案 1 :(得分:6)

试试这个:

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

t = getPOSIXTime

它有6位小数的精确度。

答案 2 :(得分:4)

怎么样:

import Data.Time.Clock.POSIX (getPOSIXTime)

timeNanos, timeMicros, timeMillis :: IO Integer

t mul = round . (mul *) <$> getPOSIXTime
timeNanos  = t 1000000000
timeMicros = t 1000000
timeMillis = t 1000

main = do
  tNanos  <- timeNanos
  tMicros <- timeMicros
  tMillis <- timeMillis

  print tNanos
  print tMicros
  print tMillis

-- OUT:
-- 1539161680010615122
-- 1539161680010617
-- 1539161680011

答案 3 :(得分:2)

还有Real World Haskell中讨论的解决方案:

import System.Time
getClockTime >>= (\(TOD sec _) -> return sec)

答案 4 :(得分:1)

也许:

getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round

Round是获取实际上不是强制性的整数...

原始答案没有(1000*) - 现在已修复

答案 5 :(得分:-8)

这有效:

import System.IO.Unsafe
import Data.Time.Clock.POSIX

time = round (unsafePerformIO getPOSIXTime) :: Int

unsafePerformIO从IO monad中提取时间。舍入到Int然后产生期望的结果。

更新:  在我的Haskell Web应用程序中,我有时会使用unsafePerformIO来填充带有随机数和隐藏时间戳的HTML复选框和单选按钮表单。有时,我的文本字段和文本框表单允许用户(交互式游戏的玩家)提供诸如任意数字和日期之类的数据。 Justin,我相信你不认为用户提供的值比我提供给表单的随机数和时间戳更安全吗?而且我希望你不要认为我的意思是“如果你不明白你在做什么就会使用像unsafePerformIO这样的东西。”

Web浏览器使用HTML,CSS和Javascript。您无法“将其保留在IO monad中”,并且浏览器的执行速度不会更高或更低,具体取决于它们接收的值是如何从Haskell monad中传出的。

Justin,为了每个阅读此页面的人的利益,我请你重新考虑并说你是否仍然认为我“真的不应该这样使用unsafePerformIO”?我的思绪是敞开的。我只是不知道在我的工作中我可能做错了什么,或者为什么不鼓励读者通过两次下来的选票向我学习。

P.S。我听说不应该在孩子面前或混合公司面前说#@!%。我是否发布了新手可能会看到的“U”字样?天堂禁止! -DS