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

问题描述 投票:25回答:6

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

也许类似于java的东西

System.currentTimeMillis();

编辑:作为IntInteger

haskell
6个回答
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

6
投票

试试这个:

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

t = getPOSIXTime

它有6位小数的精度。


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

2
投票

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

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

1
投票

也许:

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

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

原来的答案是没有(1000*) - 现在是固定的


-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”?我的思绪是敞开的。我只是不知道在我的工作中我可能做错了什么,或者为什么读者不应该沮丧地通过两次下来的选票向我学习。

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

© www.soinside.com 2019 - 2024. All rights reserved.