重复事件
通过 iCalendar RRULE 语法的实用子集,让事件按日、周、月、年重复——字符串或类型化对象均可。事件的 start 即 DTSTART,每次出现都继承其时间与时长。
// String form (RFC 5545 RRULE subset)…
recurrence: 'FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10'
// …or the equivalent object form
recurrence: {
freq: 'weekly', // 'daily' | 'weekly' | 'monthly' | 'yearly'
interval: 1, // every N periods
byDay: [1, 3, 5], // 0 = Sunday … 6 = Saturday
count: 10 // or: until: new Date(2027, 0, 1)
}
// Cancel individual occurrences by date:
exdates: [new Date(2026, 7, 19)]五种重复模式
周一
周二
周三
周四
周五
周六
周日
31
9月 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
10月 1
2
3
4
支持的规则要素
| RRULE | 对象形式 | 含义 |
|---|---|---|
FREQ=DAILY|WEEKLY|MONTHLY|YEARLY | freq | 基础频率(必填)。 |
INTERVAL=2 | interval | 每隔 2 天/周/月/年。 |
COUNT=10 | count | 共出现 10 次(从事件起始日起算)。 |
UNTIL=20261231 | until | 最后一次可能出现的日期(含当天)。 |
BYDAY=MO,WE,FR | byDay: [1,3,5] | 每周重复时指定星期几。 |
BYDAY=2TU / -1FR | byNthDay | 每月的第 2 个周二 / 最后一个周五。 |
BYMONTHDAY=1,15 | byMonthDay | 每月的指定日期。 |
| — | exdates: Date[] | 跳过这些日期上的出现(已取消的实例)。 |
行为细节
- 跨越夏令时切换时,每次出现保持原事件的“墙上时钟”时间。
- 每月重复会跳过不存在该日期的月份(1 月 31 日 → 没有 2 月 31 日),与 Google 日历一致。
- 起始于 2 月 29 日的每年重复只在闰年出现。
- 重复实例带 ↻ 标记。拖动或调整某一次会弹出确认层,提供“仅此日程”(拆分该次为独立日程)与“此次及以后”(在该点拆分系列)两种选择——与 Google 日历一致。
- 详情弹层提供“删除仅此次”(添加 exdate)与“删除整个系列”两个操作。
- 展开仅针对可见范围,且每个事件硬上限 1000 次,可安全使用无限重复规则。
编辑重复系列 —
“仅此日程”与“此次及以后”均已内置:onSeriesDetach / onSeriesSplit 回调上报结果,COUNT 与 exdates 自动重新分配,拖拽改变星期几时每周 BYDAY 列表会自动重锚。纯函数 detachOccurrence、excludeOccurrence、splitSeries 也已导出供数据层使用。