# 重复日期生成器

> 将起始日期和重复规则转换为完整的日期列表——每日、每周、每月或每年，支持每月第N个和最后一个星期几模式，显示等效RRULE并可打印日程。

- **Category:** 日期与时间
- **Interactive calculator:** https://youcalc.com/zh/date-time/recurring-date-generator/
- **Price:** Free, no sign-up required

## Overview

该生成器将一个起始日期和重复规则展开为其产生的完整有序日期列表，再将该列表以可打印、可分享的日程表形式呈现。规则模型遵循 iCalendar RRULE 标准（RFC 5545）：频率（每天、每周、每月或每年）、间隔 N（"每 N 个单位"）、周规则的可选星期选择、月度模式（每月同一天、"第 N 个星期几"如第 3 个星期五，或最后一个星期几），以及结束条件——在指定次数后或到某个截止日期（含）为止。每个日期均以其星期和 ISO 8601 格式（YYYY-MM-DD）显示，并附有等效的 RRULE 字符串，可直接粘贴到日历应用中。

## How to read your result

标题显示该规则生成的日期总数，旁边列出第一个日期、最后一个日期和天数跨度。下方的日程表按顺序列出每次重复——序号、星期和 ISO 日期——"各月重复次数"图表则显示日期在日历中的分布情况。灰色 RRULE 行是以 RFC 5545 语法写出的同一规则（例如 RRULE:FREQ=MONTHLY;BYDAY=3FR;COUNT=12 表示"每月第 3 个星期五，共十二次"）。日期以 UTC 计算，因此列表不会因夏令时切换而偏移一天，且系列上限为 500 个日期——如果规则会生成更多，您将看到前 500 个并附有说明。

## Method

引擎以 UTC（Date.UTC）读取起始日期，确保夏令时切换不会偏移任何一天。对于每日、每月和每年规则，它遍历重复索引 i = 0, 1, 2 … 并构建候选日期：每日加 i × 间隔天；每月推进 i × 间隔月，并保留起始日（跳过不含该日的月份）、解析第 N 个星期几或最后一个星期几；每年在起始月日上推进 i × 间隔年（平年跳过 2 月 29 日）。周规则以起始周的星期一为基准，每次推进间隔周，输出每个选定的星期。任何早于起始日期的候选项均被跳过；任何不存在的日历日被跳过；生成在达到请求次数、含终止日期 UNTIL 或 500 个日期上限时停止。结果还包括按日历月分组的日期和等效 RFC 5545 RRULE 字符串。计算是纯函数，不访问时钟或网络。

## Example

- **Setup:** 将起始日期设为 2026 年 1 月 1 日，选择每月，"第 N 个星期几"模式，第 3 个星期五，结束于 3 次重复后。
- **Result:** 生成器返回 2026-01-16、2026-02-20 和 2026-03-20——每月第 3 个星期五——RRULE 行读作 RRULE:FREQ=MONTHLY;BYDAY=3FR;COUNT=3。由于只输出起始日期及之后的日期，1 月的第 3 个星期五（16 日）为第一条。

## Frequently asked questions

### RRULE 字符串有什么用？

RRULE 是 RFC 5545 中的重复规则语法——iCalendar 标准，Google 日历、Apple 日历、Outlook 和大多数日程工具均基于此标准。生成器将您的规则写成一行 RRULE（FREQ、INTERVAL、BYDAY、COUNT 或 UNTIL），以便您粘贴到日历事件或 .ics 文件中，在那里精确重现相同的系列。

### 如何处理不存在的日期，如 31 日或 2 月 29 日？

这些日期会被跳过，永远不会顺延——与 RFC 5545 规定完全一致。从 31 日开始的每月"同一天"规则仅在包含 31 日的月份触发（因此 2 月、4 月、6 月、9 月和 11 月被跳过）。2 月 29 日的年度规则仅在闰年出现。生成器不会悄悄将缺失日期移至第 1 天或第 28 天。

### 这与"每月第 N 个星期几查询工具"有何不同？

第 N 个星期几查询工具回答一个问题——某个月的第 3 个星期四是哪一天。本生成器输出完整的重复系列：每月第 3 个星期四，持续您所要求的次数（或到任何截止日期），加上等效 RRULE 和可打印日程表。

### 生成的日期数量有限制吗？

有——系列严格上限为 500 个日期。如果您选择"到某个日期"且规则会生成超过 500 次，生成器返回前 500 个并提示规则在显示范围之外仍继续。按次数计数（"N 次后"）本身也限制为 500。

### 日期属于哪个时区？

日期是不含时间和时区的日历日期——以 UTC 计算，确保运算稳定。含多个星期的周规则以起始日期所在周的星期一为基准（RFC 5545 默认周起始日），列表中只显示起始日期及之后的日期。

## Related calculators

- [每月第几个星期几查询计算器](https://youcalc.com/zh/date-time/nth-weekday-finder/)
- [项目截止日期规划器——阶段排期与缓冲](https://youcalc.com/zh/date-time/deadline-planner/)
- [排班日历计算器：做四休四、Panama、DuPont](https://youcalc.com/zh/date-time/shift-pattern-calculator/)
- [课程表计算器](https://youcalc.com/zh/date-time/timetable-calculator/)

## Sources

- https://datatracker.ietf.org/doc/html/rfc5545
- https://en.wikipedia.org/wiki/ISO_8601

---

Interactive version: https://youcalc.com/zh/date-time/recurring-date-generator/ · From YouCalc — https://youcalc.com
