【问题标题】:ICS RRULE for first day of every month with exceptions for weekends每个月第一天的 ICS RRULE,周末除外
【发布时间】:2020-03-30 15:34:30
【问题描述】:

你能为以下场景指定一个 RRULE 吗?

每月第一天重复。 除非,如果它落在星期日,则在第二天(每月 2 日星期一)再次发生。 除非,如果它落在星期五,则在前一天(上个月的最后一个星期五)重复。

这只是一个练习,看看有什么可能以及如何解决各种问题。

我尝试使用 3 个单独的 RRULE 进行设置:

RRULE:FREQ=MONTHLY;BYMONTHDAY=1;BYDAY=MO,TU,WE,TH,FR
RRULE:FREQ=MONTHLY;BYMONTHDAY=2;BYDAY=MO
RRULE:FREQ=MONTHLY;BYSETPOS=-1;BYDAY=FR

第一条规则可以满足我的要求 - 只有当它在工作日时才在每月的第一天。 第二条规则做我想要的——如果第一条是在星期日,那么这条规则会选择下一个星期一,也就是本月的第二个星期一。 第三条规则是问题。这会选择每个月的最后一个星期五。但我想要的是这个月的最后一天,只要它是星期五。或者,换一种说法,只有当月的最后一天是该月的最后一个星期五。这有点棘手,因为您不能使用 BYMONTHDAY,因为不同的月份有不同的天数,而且我认为 BYMONTHDAY=-1 不能按预期工作。 有人能想出正确的规则“只有当月的最后一天是星期五”。

【问题讨论】:

    标签: icalendar rrule


    【解决方案1】:

    RFC5545 在3.3.10 Recurrence Rule 中有一个表,其中指定:

    • 多个BYxxxFREQ规则部分值的依赖关系。
    • BYxxx 的评估顺序:
          If multiple BYxxx rule parts are specified, then after evaluating
          the specified FREQ and INTERVAL rule parts, the BYxxx rule parts
          are applied to the current set of evaluated occurrences in the
          following order: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY,
          BYHOUR, BYMINUTE, BYSECOND and BYSETPOS; then COUNT and UNTIL are
          evaluated.
    

    当你把所有这些放在一起时,你的第三个RRULE 应该是这样的:

    RRULE:FREQ=MONTHLY;BYMONTHDAY=-1;BYDAY=FR
    

    这基本上是说任何一个月的最后一天,即星期五,都将成为重复集的一部分——据我了解,这是你想要的结果——。

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多