睡到下一分钟的开始

ehi*_*ird 11 time haskell

我正在尝试编写一些代码,直到本地时区的下一分钟开始,但是我很难这样做.该time库一直是我的弱点之一,因此我假设有一些简单的方法来做到这一点.

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

处理闰秒也是一个很好的奖励.

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

Ant*_*ony 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"
Run Code Online (Sandbox Code Playgroud)