我正在尝试编写一些代码以便在本地时区的下一分钟开始睡觉,但这样做很困难。 time
库一直是我的弱点之一,所以我假设有一些简单的方法可以做到这一点。
我想过只计算一个新的TimeOfDay,但这不会处理23:59到00:00,并且可能会在夏令时切换时做很混乱的事情。
处理闰秒也是一个不错的奖励。
使用Control.Concurrent.threadDelay进行睡眠对我来说似乎是最简单的方法,所以另一个问题是:如何在下一分钟开始之前获得微秒数? DiffTime
和NominalDiffTime
是完全可以接受的方法。
答案 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
来管理时区特定的内容,但是您必须做额外的工作来管理日偏移。