rrule重复日程算法

sdq
Explore, Think, Create
2 min readAug 10, 2016

项目中遇到重复日程的需求,用swift重写了一遍python的rule,先给出仓库地址,这边整理一下整个算法的思路。

首先要做好的准备是mask,可见算法代码中的 M366MASK M365MASK MDAY366MASK等等,这个基本是日历类算法所必备的。

这里要注意的有三点

  • 需要对闰年与非闰年做两套mask
  • 每个mask都应该比365和366多加上7,以应对周的跨年情况。
  • 由于重复日程算法可能是无穷无尽,所以需要加上一个循环最大值,以确保算法性能。项目中给出的MaxRepeatCycle循环最大值是十年。

根据rrule的属性创建规则后我们就可以开始我们的算法了,总结为4个核心步骤:

  1. 取下一个周期的每一天放进dayset里,这里的每一天已经从NSDate转换成了Int(这一年中的第几天)了。按周重复的话就取下面7天,按月重复的话取下面28、29、30、31天(根据具体年月选取),按年重复的话就去接下来365、366天。
  2. 通过预先设置好的重复条件mask筛选days中的数据,最后加入到filterDayset中。
  3. 这一步将filterDayset中的数据加入到我们最后输出的结果里,并判断重复的结束条件,包括是否在需要查询的日期范围内,或者是否已经超出了最大循环次数。
  4. 加上增量的天数,进入下一次循环,返回第一步。

具体实现的步骤可以直接看源代码,配套了Mac的小demo。按小时、按分钟、按秒重复还在todolist上,之后会补上。

--

--