【问题标题】:Can RRule descirbe an event that occurs at two specific times each day?RRule 能否描述每天在两个特定时间发生的事件?
【发布时间】:2015-09-14 22:52:58
【问题描述】:

假设我有一个事件发生在每天晚上 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

【问题讨论】:

  • 我不认为你可以在一个 RRULE 中,但如果你正在使用 icalendars(或 vcalendars),你可以简单地在一个组件中添加多个 RRULES,所以RRULE;FREQ=DAILY;BYHOUR=10;BYMINUTE=0 RRULE';FREQ=DAILY;BYHOUR=14;BYMINUTE=30 会做你想做的事.否则,我无法在 RFC 中直接找到有关如何在 oneliner 中执行您的特定案例的任何内容。

标签: rrule


【解决方案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 ║ 小时 ║ 分钟 ║ ╠═══╬══════╬════════╣ ║ 1 ║ 10 ║ 00 ║ ║ 2 ║ 10 ║ 30 ║ ║ 3 ║ 14 ║ 00 ║ ║ 4 ║ 14 ║ 30 ║ ╚═══╩══════╩════════╝

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

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

【讨论】:

  • 这样想:RRULE 会生成多个事件实例。 BYSETPOS 将从 RRULE 生成的集合中选择特定的实例。
【解决方案2】:

虽然 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2016-08-01
    相关资源
    最近更新 更多