0

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

现在,我知道有一些 php 类,如WhenRRules等来处理 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 或单日。

在此先感谢希望有人可以帮助我。;)

4

1 回答 1

1

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

没有可靠的方法可以像您尝试做的那样更改规则。正如您所注意到的,一旦您开始进行除了基本的每日/每周/每月/每年重复之外的任何事情,您的技巧就不再起作用了。而你甚至还没有触及表面,就像BYSETPOSCOUNT一场真正的噩梦。

你只有两种方法:

  1. 循环遍历所有事件,从DTSTART忽略经期开始之前的任何内容开始,到经期结束时停止
  2. 或生成您的经期日期的完整列表,并针对RRULE. 这可以通过消除过程来完成(例如:您RRULE只发生在星期日并且日期不是星期日?然后丢弃并继续前进)。然而,在最复杂的情​​况下,唯一的解决方案是恢复到选项 1 并计算所有出现的次数。

虽然您可以自己编写这些代码,但我建议为此使用 lib。我是php-rrule的作者,您可以使用 lib getOccurrencesBetween($begin, $end)(实现选项 1)和occursAt($date)(实现选项 2)。

于 2016-07-11T18:52:29.143 回答