【问题标题】:PHP - Getting the next occurrence of a date between a periodPHP - 获取一个时期之间的下一次出现的日期
【发布时间】:2016-05-08 14:31:16
【问题描述】:

我正在处理使用 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 或单个 DAY。

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

【问题讨论】:

标签: php datetime date-range repeat rrule


【解决方案1】:

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

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

你只有两种方法:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多