Подтвердить что ты не робот

Получите Unix/Epoch time как Int

Есть ли функция в haskell для периода времени в секундах/миллисекундах?

возможно что-то похожее на java

System.currentTimeMillis();

изменить: как Int или Integer?

4b9b3361

Ответ 1

Да.

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

Ответ 2

Попробуйте следующее:

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

t = getPOSIXTime

Он имеет 6 десятичных знаков точности.

Ответ 3

Как насчет:

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

Ответ 4

Существует также решение, обсуждаемое в Real World Haskell:

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

Ответ 5

Может быть:

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

Round - получить целое число, которое на самом деле не является обязательным...

исходный ответ был без (1000*) - теперь исправлено

Ответ 6

Это работает:

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

time = round (unsafePerformIO getPOSIXTime) :: Int

unsafePerformIO извлекает время из монады IO. Округление до Int дает желаемый результат.

UPDATE:  В моих веб-приложениях Haskell я иногда использую unsafePerformIO для заполнения HTML-флажка и форм-кнопок с произвольными номерами и скрытыми отметками времени. Иногда текстовые поля и текстовые поля позволяют пользователям (игрокам интерактивных игр) предоставлять такие данные, как произвольные числа и даты. Джастин, я надеюсь, вы не считаете, что предоставленные пользователем значения более безопасны, чем случайные числа и штампы времени, которые я подаю в формы? И я надеюсь, что вы не думаете, что я имел в виду: "Используйте такие вещи, как unsafePerformIO, если вы не понимаете, что делаете".

Веб-браузеры используют HTML, CSS и Javascript. Вы не можете "сохранить его в монаде IO", и браузеры не работают более или менее безопасно, в зависимости от того, как получаемые ими значения выходят из монадов Haskell.

Джастин, в интересах всех, кто читает эту страницу, я прошу вас пересмотреть и сказать, если вы все еще думаете, что я "действительно не должен использовать небезопасныйPerformIO таким образом"? Мой ум открыт. Я просто не знаю, что, во всяком случае, я могу ошибаться в своей работе или почему читателям не следует уклоняться от изучения от меня двумя голосами.

P.S. Я слышал, что нельзя говорить # @!% Перед детьми или в смешанной компании. Я опубликовал слово "U", где новички могли его увидеть? Боже упаси! -DS