【问题标题】:rrule for repeating monthly on the 31st or closest day在第 31 天或最近的一天重复每月一次的规则
【发布时间】:2016-06-15 22:17:56
【问题描述】:

您将如何为每月重复的每月 31 日(或 30 日或 29 日)的事件指定一个规则,如果该月没有足够的天数,它会选择最接近的天数(即 2 月它会选择 28 日或 29 日,4 月会选择 30 日)?

如果相关的话,从技术上讲,我正在使用 rrule javascript 库。

为了添加上下文,我有一个表单,用户可以在其中指定重复开始日期(每年、每月、每周、每天),例如账单。如果帐单通常在 30 日到期,那么在 2 月,它将在 28 日(或 29 日)到期。

【问题讨论】:

  • 取下个月的第一天,然后再回去一天……?

标签: javascript rrule


【解决方案1】:

最简单的RRULE 获取“本月的最后一天”,无论它是在 28 日、29 日、30 日还是 31 日:

FREQ=MONTHLY;BYMONTHDAY=-1

您的查询听起来就是您所追求的。

不过,我不知道您提到的 rrule javascript 库是否支持此功能。

【讨论】:

  • 这是不对的。需要额外的BYMONTHDAY=28,29,30,31
  • @JuliusŠ。不确定您所说的“附加”是什么意思,因为RFC 2445 第 4.3.10 节“重复规则”明确指出 BYMONTHDAY “ 等关键字是可选的,但不得出现超过一次”。相反,如果您的意思是 BYMONTHDAY=-1,28,29,30,31,则结果将是从 28 号到月底的所有天。
  • rrule javascript 库似乎有一个demo,可以测试可能的解决方案。 FREQ=MONTHLY;BYMONTHDAY=-1RRULE 字符串 下输入时会产生预期结果。
【解决方案2】:

RRULE 有一个名为 RSCALE 的新扩展来涵盖这种情况。不幸的是,它还没有得到广泛的支持。不确定您正在使用的 Javascript rrule 库,但如果不是这种情况,您应该打开一个问题。

使用RSCALE 扩展你的RRULE 看起来像这样:

FREQ=MONTHLY;RSCALE=GREGORIAN;BYMONTHDAY=31;SKIP=BACKWARD

具有此 RRULE 的事件在每个月的 31 日重复发生,除非该天不存在,在这种情况下 SKIP=BACKWARD 表示“使用前一个有效日期”。

编辑

我刚刚知道不用RSCALE 的另一种表达方式:

每个月的 31 日,回退到该月的最后一个有效日期:

FREQ=MONTHLY;BYMONTHDAY=28,29,30,31;BYSETPOS=-1

每月 30 日,2 月回落至 28 日或 29 日(闰年)

FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1

每月 29 日,非闰年回落至 2 月 28 日

FREQ=MONTHLY;BYMONTHDAY=28,29;BYSETPOS=-1

但是,正如大家所见,RSCALE 显然更直观。

【讨论】:

  • 很遗憾 rrule 不支持 RSCALE 或 SKIP,但这确实是解决方案。谢谢!
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2020-10-02
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多