睡到下一分钟的开始

时间:2011-12-20 12:01:35

标签: haskell time

我正在尝试编写一些代码以便在本地时区的下一分钟开始睡觉,但这样做很困难。 time库一直是我的弱点之一,所以我假设有一些简单的方法可以做到这一点。

我想过只计算一个新的TimeOfDay,但这不会处理23:59到00:00,并且可能会在夏令时切换时做很混乱的事情。

处理闰秒也是一个不错的奖励。

使用Control.Concurrent.threadDelay进行睡眠对我来说似乎是最简单的方法,所以另一个问题是:如何在下一分钟开始之前获得微秒数? DiffTimeNominalDiffTime是完全可以接受的方法。

3 个答案:

答案 0 :(得分:10)

我担心这可能不是你想要的,因为你后来的评论。我认为这可以容忍闰年,时区变化和日期变化,但不是闰秒。

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"

答案 1 :(得分:2)

也许这会对您有所帮助:PLEAC-Haskell: Dates and Times

在它的帮助下,您应该能够获得当前分钟,您可以用它来创建下一分钟开始的时间。然后把差异当作睡眠时间。

答案 2 :(得分:1)

我不是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来管理时区特定的内容,但是您必须做额外的工作来管理日偏移。