3

假设我有一个事件发生在每天晚上 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/进行测试会产生以下结果:

  • 周一 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
4

2 回答 2

4

我发现我可以使用以下方法完成这项工作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 ║ 小时 ║ 分钟 ║
╠═══╬══════╬════════╣
║ 1 ║ 10 ║ 00 ║
║ 2 ║ 10 ║ 30 ║
║ 3 ║ 14 ║ 00 ║
║ 4 ║ 14 ║ 30 ║
╚═══╩══════╩════════╝

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

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

于 2015-09-15T16:31:47.270 回答
1

虽然在 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 个 RRULES。

如果您确实关心通用日历客户端,那么您将面临风险:

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

作为一种解决方法,您可能希望创建 2 个事件并将它们与相关属性链接(https://www.rfc-editor.org/rfc/rfc5545#section-3.8.4.5

于 2015-09-15T11:05:33.167 回答