Спать до начала следующей минуты - PullRequest
11 голосов
/ 20 декабря 2011

Я пытаюсь написать некоторый код для сна до начала следующей минуты в местном часовом поясе, но мне очень трудно это сделать. Библиотека time всегда была одним из моих слабых мест, поэтому я предполагаю, что есть простой способ сделать это.

Я думал о том, чтобы просто вычислить новый TimeOfDay , но он не справился бы с 23:59 до 00:00 и, вероятно, мог бы сделать очень запутанные вещи с переходами на летнее время.

Хорошим бонусом будет и обработка високосных секунд.

Использование Control.Concurrent.threadDelay для сна кажется мне самым простым методом, поэтому можно задать другой вопрос: как я могу получить количество микросекунд до начала следующей минуты? DiffTime и NominalDiffTime будут вполне приемлемыми способами для достижения этого.

Ответы [ 3 ]

10 голосов
/ 20 декабря 2011

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

import Control.Concurrent (threadDelay)
import Data.Time.Clock

sleepToNextMinute :: IO ()
sleepToNextMinute = do t <- getCurrentTime
                       let secs = round (realToFrac $ utctDayTime t) `rem` 60
                       threadDelay $ 1000000 * (60 - secs)

main = do putStrLn "Starting..."
          sleepToNextMinute
          putStrLn "Minute 1"
          sleepToNextMinute
          putStrLn "Minute 2"
2 голосов
/ 20 декабря 2011

Может быть, это вам поможет: PLEAC-Haskell: даты и время .

С его помощью вы сможете получить текущую минуту, с которой вы можете создать времяначала следующей минуты.Тогда просто примите разницу как время сна.

1 голос
/ 20 декабря 2011

Я не эксперт по пакету time, но как насчет этого:

import Data.Time    -- need Clock and LocalTime

curTime <- getCurrentTime
let curTOD = timeToTimeOfDay $ utctDayTime curTime
    last   = TimeOfDay (todHour curTOD) (todMin curTOD) 0
    diff   = timeOfDayToTime last + 60 - utctDayTime curTime

Это приведет к diff :: DiffTime с правильной разницей в секундах; все границы и високосные годы должны быть учтены. Я не уверен насчет високосных секунд; вам, вероятно, потребуется добавить их вручную.

Это не относится к каким-либо искажениям, связанным с часовым поясом, но, поскольку getCurrentTime возвращает UTCTime, я думаю, что оно будет работать в целом. Вы можете попробовать использовать utcToLocalTimeOfDay вместо timeToTimeOfDay для управления вещами, относящимися к часовому поясу, но тогда вам придется проделать дополнительную работу для управления смещениями дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...