haskell 中是否有以秒/毫秒为单位的纪元时间函数?
也许类似于java的东西
System.currentTimeMillis();
编辑:作为Int
或Integer
?
haskell 中是否有以秒/毫秒为单位的纪元时间函数?
也许类似于java的东西
System.currentTimeMillis();
编辑:作为Int
或Integer
?
是的。
可以Int
像这样检索 UNIX 纪元时间:
> :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)
import Data.Time.Clock.POSIX
f :: Integral b => IO b
f = 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 复选框和单选按钮表单。有时我的文本字段和文本框表单允许用户(互动游戏的玩家)提供诸如任意数字和日期之类的数据。贾斯汀,我相信你不认为用户提供的值比我提供给表单的随机数和时间戳更安全?而且我希望您不要认为我的意思是“如果您不了解自己在做什么,请使用诸如 unsafePerformIO 之类的东西。”
Web 浏览器使用 HTML、CSS 和 Javascript。您不能“将其保留在 IO monad 中”,并且浏览器不会或多或少地安全运行,具体取决于它们从 Haskell monad 中接收到的值的方式。
贾斯汀,为了所有阅读此页面的人的利益,我请您重新考虑并说您是否仍然认为我“真的不应该以这种方式使用 unsafePerformIO”?我的思想是开放的。我只是不知道我在工作中可能做错了什么(如果有的话),或者为什么不应该通过两次反对票阻止读者向我学习。
PS我听说一个人不应该在孩子面前说#@!%,或者在混合公司。我是否在新手可能看到的地方发布了“U”字?上天禁止!-DS