算法:如何检查重复事件定义的交叉点?

时间:2010-05-25 11:25:39

标签: algorithm date recurring

问题来自MS Outlook日历行为。

想象一下,我有两个反复发生的事件(从今天开始):“每个第二个星期一”和“每个奇怪的日期”。有没有办法检查交叉点和/或在算法上找到第一个交叉日期,而不是在每个日期强制执行?

可以用CRON符号或ICal符号表示定义。我认为没关系。

格里高利历中有没有解决方法?

UPD :了解MS Outlook日历如何处理这些事件也很有趣。我的意思是它如何发现前者。今天有两个活动?我想也应该是确定具体日期是否适合重复事件定义的技术。

形式上它可以描述为两个函数算法:

Date:intersection(Event e1, Event e2)
boolean:contains(Date date, Event ev)

关于限制,我们可以从事件定义表示法开始。您可以在outlook(或iCal)中看到,您可以定义不是那种复杂的重复事件。

2 个答案:

答案 0 :(得分:1)

由于第一次复发的时间是14天,因此当月份以奇数结束时,当天的奇偶校验(奇数或偶数)将发生变化:Jan,leap Feb,Mar,May,Jul,Aug,Oct, 12月在一个月内它不会改变。

答案 1 :(得分:1)

如果您只关心同一天发生的不同复发事件,您可以:

  • 在最近的第1天建立一些任意日子。
  • 将每次重复表示为事件与开始日之间的“天数”;如果你的事件发生在每个星期一和每个星期四,那么表示这是2次重复,有2个开始日。
  • 使用适当的模运算来查找不同重现事件发生碰撞的天数。

例如,如果“每个星期一”和每个“第5天”的复发都在第1天发生碰撞,那么它们将在第36天,第71天,第106天等发生碰撞

如果你想要更精确的东西,你需要不是在整天测量,而是在你感兴趣的一天中测量。