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/ 进行测试会产生以下结果:
- 星期一 10:00
- 星期一 10:30
- 星期一 14:00
- 周一 14:30
- 星期二10:00
- 星期二10:30
- 星期二14:00
- 星期二14:30
我真正想要的是这个:
- 星期一 10:00
- 周一 14:30
- 星期二10:00
- 星期二10:30
- 周三 10:00
- 周三 14:30
- 周四10:00
- 周四14:30
虽然在 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)时有效。
假设我每天在 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/ 进行测试会产生以下结果:
- 星期一 10:00
- 星期一 10:30
- 星期一 14:00
- 周一 14:30
- 星期二10:00
- 星期二10:30
- 星期二14:00
- 星期二14:30
我真正想要的是这个:
- 星期一 10:00
- 周一 14:30
- 星期二10:00
- 星期二10:30
- 周三 10:00
- 周三 14:30
- 周四10:00
- 周四14:30
虽然在 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)时有效。