PHP - 在一个句点之间下一次出现日期

时间:2016-05-08 14:31:16

标签: php datetime date-range repeat rrule

我正在处理使用 RRULE 来处理重复的icalendar事件;

现在,我知道有一些php类,如 RRules 等...来处理RRULE并且我已经在使用它,以完成生成重复事件的任务,但问题是关于长日期范围的性能。

所以我想通过[ MONTH, WEEK, DAY ]的当前日历视图限制范围(开始和结束)来加快生成重复的任务。

假设我们有一个像

这样的重复事件
FREQ=DAILY;INTERVAL=1;DTSTART:2009-01-01

我所做的显然是将DTSTART更改为今天的日期,并添加UNTIL日期以将循环限制为近距离,并且它正常工作。问题来自于这些规则:

FREQ=WEEKLY;BYDAY=SU;DTSTART:2009-01-01

FREQ=WEEKLY;INTERVAL=5;DTSTART:2009-01-01

使用这种规则我的伎俩不起作用,因为原始开始日期与我今日的日期不符。

我试过没有运气使用DateTime Period和Interval进行一些迭代,但我无法弄明白。

所以我要问的是找到一个给定日期何时会在我的视图范围内重现的方法,可以是MONTH,WEEK或单日。

提前谢谢希望有人可以帮助我。 ;)

1 个答案:

答案 0 :(得分:1)

我知道这个问题已经很老了,但我会回答以防万一。

没有可靠的方法可以像您尝试的那样更改规则。正如您所注意到的,一旦您开始拥有的不仅仅是基本的每日/每周/每月/每年重复,您的技巧就不再适用了。你甚至还没有触及表面,BYSETPOSCOUNT之类的东西是一场真正的噩梦。

您只有两种方法:

  1. 循环播放所有事件,从DTSTART开始忽略在您的期间开始之前的任何事情,并在您到达期间结束时停止
  2. 或生成所有期间的完整日期列表,并针对RRULE对每个日期进行测试。这可以通过消除过程来完成(例如:您的RRULE仅发生在星期日,日期不是星期日?然后丢弃并继续前进)。但是,在最复杂的情​​况下,唯一的解决方案是恢复到选项1并计算所有出现次数。
  3. 虽然您可以自己编写代码,但我建议使用lib。我是php-rrule的作者,使用lib可以使用getOccurrencesBetween($begin, $end)(实现选项1)和occursAt($date)(实现选项2)。