您将如何为每月重复的每月 31 日(或 30 日或 29 日)的事件指定规则,如果该月没有足够的天数,它会选择最接近的天数(即 2 月它会选择28 日或 29 日,4 月会选择 30 日)?
从技术上讲,如果相关的话,我正在使用rrule javascript 库。
为了添加上下文,我有一个表单,用户可以在其中指定重复开始日期(每年、每月、每周、每天),例如账单。如果账单通常在 30 日到期,那么 2 月将在 28 日(或 29 日)到期。
您将如何为每月重复的每月 31 日(或 30 日或 29 日)的事件指定规则,如果该月没有足够的天数,它会选择最接近的天数(即 2 月它会选择28 日或 29 日,4 月会选择 30 日)?
从技术上讲,如果相关的话,我正在使用rrule javascript 库。
为了添加上下文,我有一个表单,用户可以在其中指定重复开始日期(每年、每月、每周、每天),例如账单。如果账单通常在 30 日到期,那么 2 月将在 28 日(或 29 日)到期。
有一个新的扩展RRULE
来RSCALE
覆盖这种情况。不幸的是,它还没有得到广泛的支持。不确定您正在使用的 Javascript rrule 库,但如果不是这样,您应该打开一个问题。
使用RSCALE
扩展你RRULE
会看起来像这样:
FREQ=MONTHLY;RSCALE=GREGORIAN;BYMONTHDAY=31;SKIP=BACKWARD
每月每 31 日重复发生此事件RRULE
,除非那一天不存在,在这种情况下会SKIP=BACKWARD
说“使用前一个有效日期”。
编辑
我刚刚意识到另一种表达方式,而无需RSCALE
:
FREQ=MONTHLY;BYMONTHDAY=28,29,30,31;BYSETPOS=-1
FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1
FREQ=MONTHLY;BYMONTHDAY=28,29;BYSETPOS=-1
然而,正如人们所看到的,这显然更直观RSCALE
。
无论是在 28 日、29 日、30 日还是 31 日,最简单RRULE
的获取“本月的最后一天”的方法是:
FREQ=MONTHLY;BYMONTHDAY=-1
您的查询听起来就是您所追求的。
但是,我不知道您提到的 rrule javascript 库是否支持这一点。