我正在尝试编写一些代码以便在本地时区的下一分钟开始之前进入休眠状态,但是这样做有很大的困难。 time
库一直是我的弱点之一,所以我假设有一些简单的方法可以做到这一点。
我想到了只计算一个新的TimeOfDay,但这将无法处理23:59到00:00,并且可能会使夏令时切换变得非常困惑。
处理leap秒也是一个不错的奖励。
对我来说,使用Control.Concurrent.threadDelay进行 sleep 似乎是最简单的方法,因此另一个问题是:如何获得直到下一分钟开始的微秒数? DiffTime
和NominalDiffTime
是实现此目的的完全可接受的方法。
最佳答案
考虑到以后的评论,我担心这可能不是您想要的。我认为这可以容忍leap年,时区更改和日期更改,但不能容忍seconds秒。
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"