RRule 能否描述每天在两个特定时间发生的事件?

Can RRule descirbe an event that occurs at two specific times each day?

假设我每天在 7:00 和 2:00pm 发生一个事件。 RRule 看起来像这样:

FREQ=DAILY;BYHOUR=10,14

如果我想要在 10:00am 和下午 2:30 发生的事件,我会假设 它看起来像这样:

FREQ=DAILY;BYHOUR=10,14;BYMINUTE=0,30

但这似乎不正确。规范说 "BYxxx rule parts for a period of time less than the frequency generally increase or expand the number of occurrences of the recurrence"。在 http://jkbrzt.github.io/rrule/ 进行测试会产生以下结果:

我真正想要的是这个:

虽然在 RFC2445 中支持多个 RRULE,但由于日历代理之间缺乏互操作性,它已从 RFC5545 中删除。参见 https://www.rfc-editor.org/rfc/rfc5545#section-3.6.1

              ;
              ; The following is OPTIONAL,
              ; but SHOULD NOT occur more than once.
              ;
              rrule /

同样,任何涉及 BYHOUR/BYMINUTE 的东西都可能具有非常差的互操作性(尽管它们仍在 iCalendar 规范中)。

换句话说,这完全取决于哪些应用程序将使用这些事件。如果您处于控制客户端的封闭环境中,那么您可能希望采用上述 2 条规则。

如果您确实关心通用日历客户端,那么您 运行 有风险:

  • 大多数客户不会让您完全编辑事件 RRULE,
  • 相当一部分客户在显示事件时会误解规则。

作为解决方法,您可能需要创建 2 个事件并 link 它们与 属性 (https://www.rfc-editor.org/rfc/rfc5545#section-3.8.4.5 )

我发现我可以使用 BYSETPOS:

完成这项工作
FREQ=DAILY;BYHOUR=10,14;BYMINUTE=0,30;BYSETPOS=1,4

如果您想要 10:30am 和 2:00pm,您将使用:

FREQ=DAILY;BYHOUR=10,14;BYMINUTE=30,0;BYSETPOS=2,3

循环实例将按时间顺序排列,因此BYMINUTE的顺序对BYSETPOS没有影响。为了演示,如果我们删除 BYSETPOS,上述两条规则每天都会产生以下实例:

╔═══╦══════╦════════╗
║ P ║ Hour ║ Minute ║
╠═══╬══════╬════════╣
║ 1 ║   10 ║     00 ║
║ 2 ║   10 ║     30 ║
║ 3 ║   14 ║     00 ║
║ 4 ║   14 ║     30 ║
╚═══╩══════╩════════╝

所以在第一种情况下,我们选择实例 1 和 4,在下面的情况下,我们选择实例 2 和 3。

请注意,这仅在 DTSTART 使用第一个 BYHOUR/BYMINUTE 值(上述情况下为上午 10:00)时有效。