FullCalendar V4 - 如何计算周期性事件系列中较短的月份?

FullCalendar V4 - How to account for shorter months in a recurring event series?

我正在使用 FullCalendar v4-alpha-3 with the RRule plugin 生成重复事件。它按预期工作,只有一个问题:如何修改重复发生的事件以说明比系列中的起始月份天数少的月份?

例如,如果第一个月度事件发生在 2019 年 1 月 29 日;该事件将在所有后续月份的 29 日重复,但 2 月除外,因为它只有 28 天(不包括闰年)。

我试过将 dtstart 重置为下个月的第一天。它有效,除了事件不再递归。

这是我的设置的精简片段:

let calendar = new Calendar(calendarEl, {
  plugins: [ rrulePlugin ],
  events: [
    {
      rrule: 'DTSTART:20190129 RRULE:FREQ=MONTHLY;UNTIL=20200130;COUNT=13;BYMONTHDAY=29'
    }
  ],
  eventRender: function(info) {
    ...

    // reset start date to the first day of the following month 
    // if current month has fewer days than base month

    let start = event.start;
    let day = start.getDate();            

    let now = new Date();
    let currentMonth = now.getMonth();     
    let currentYear = now.getFullYear();
    let daysInCurrent = getDaysInMonth(currentMonth + 1, currentYear);

    let nextStart = start;
    if (day > daysInCurrent) {
        nextStart = new Date(currentYear, currentMonth + 1, 1);    
        event.setStart(nextStart);   
        event.setEnd(null);                     
    } 
  }
});

如有任何见解,我将不胜感激。

不完全是我希望的解决方案,但 RRule 的 bysetpos 属性 似乎提供了下一个最佳替代方案,因为它允许在指定日期不存在的情况下使用回退日期。

例如,以下将在每个月的 30 号生成一个事件;如果没有 30 号,则为该月的最后一天:

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

来源:https://icalevents.com/2555-paydays-last-working-days-and-why-bysetpos-is-useful/