我正在尝试生成以固定间隔分隔的日期序列,例如,从现在开始,我想生成列表:
[now, now + 10 minutes, now + 20 minutes, now + 30 minutes, ...]
我的函数将基于iterate
并有两个参数start
和interval
,但这些参数的类型应该是什么?我一直在图书馆和维基中游荡,没有成功。似乎编码时间的推荐方法是使用UTCTime
中的Data.Time.Clock
,并且建议的编码时间差的方法是NominalDiffTime
,但我如何生成标称时差一天?例如?
似乎time-lens
包提供了这样做的方法,但据我所知,镜片是一种提高表现力的方法,如果使用镜片是解决这个问题的唯一方法,我会感到惊讶
答案 0 :(得分:10)
在ghci:
Data.Time> now <- getCurrentTime
Data.Time> let tenMinutes = 10*60
Data.Time> mapM_ print . take 10 . iterate (addUTCTime tenMinutes) $ now
2015-06-27 20:14:21.445443 UTC
2015-06-27 20:24:21.445443 UTC
2015-06-27 20:34:21.445443 UTC
2015-06-27 20:44:21.445443 UTC
2015-06-27 20:54:21.445443 UTC
2015-06-27 21:04:21.445443 UTC
2015-06-27 21:14:21.445443 UTC
2015-06-27 21:24:21.445443 UTC
2015-06-27 21:34:21.445443 UTC
2015-06-27 21:44:21.445443 UTC
请注意NominalDiffTime
(此处使用)忽略闰秒;也就是说,即使在这两个UTC时间之间实际存在60*60*24
秒,添加60*60*24+1
也会生成具有不同日期的相同时间。这通常(但不总是)你想要的。如果您想知道闰秒,可以使用AbsoluteTime
和DiffTime
代替UTCTime
和NominalDiffTime
。
当然你的功能可能是:
import Data.Time.Clock
timeSeq :: UTCTime -> NominalDiffTime -> [UTCTime]
timeSeq start interval = iterate (addUTCTime delta) start