假设我的活动发生在每天的下午7:00和下午2:00。 RRule看起来像这样:
FREQ=DAILY;BYHOUR=10,14
如果我想要一个发生在上午10:00和下午2: 30 下午的活动,我会假设它会是这样的:
FREQ=DAILY;BYHOUR=10,14;BYMINUTE=0,30
但这似乎不正确。该规范称“BYxxx规则部分在一段时间内的频率低于频率,一般会增加或扩大复发的次数”。在http://jkbrzt.github.io/rrule/进行测试会产生以下结果:
我真正想要的是:
答案 0 :(得分:1)
虽然RFC2445中存在对多个RRULE的支持,但由于日历代理之间缺乏互操作性,它已从RFC5545中删除。见https://tools.ietf.org/html/rfc5545#section-3.6.1
;
; The following is OPTIONAL,
; but SHOULD NOT occur more than once.
;
rrule /
同样,任何涉及BYHOUR / BYMINUTE的内容都可能具有非常差的互操作性(尽管这些仍然在iCalendar规范中)。
换句话说,这完全取决于哪些应用程序会消耗这些事件。如果您处于控制客户端的封闭环境中,那么您可能需要使用上述2个结构。
如果您关心通用日历客户端,则存在风险:
作为一种变通方法,您可能希望创建2个事件并将其与相关属性(https://tools.ietf.org/html/rfc5545#section-3.8.4.5)
链接答案 1 :(得分:1)
我发现我可以使用BYSETPOS
来完成这项工作:
FREQ=DAILY;BYHOUR=10,14;BYMINUTE=0,30;BYSETPOS=1,4
如果你想要上午10:30和下午2:00,你可以使用:
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)才有效。