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

时间:2015-09-14 22:52:58

标签: rrule

假设我的活动发生在每天的下午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点
  • 星期四14:30

2 个答案:

答案 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个结构。

如果您关心通用日历客户端,则存在风险:

  • 大多数客户都不允许您完全编辑事件RRULE,
  • 在展示活动时,不少客户会误解规则。

作为一种变通方法,您可能希望创建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)才有效。