haskell中是否有一个函数用于纪元时间,以秒/毫秒为单位?
也许类似于java的东西
System.currentTimeMillis();
编辑:作为Int
或Integer
?
是。
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
试试这个:
import Data.Time
import Data.Time.Clock.POSIX
t = getPOSIXTime
它有6位小数的精度。
怎么样:
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
还有Real World Haskell讨论的解决方案:
import System.Time
getClockTime >>= (\(TOD sec _) -> return sec)
也许:
getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round
Round
是获取实际上不是强制性的整数...
原来的答案是没有(1000*)
- 现在是固定的
这有效:
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