中国节假日补充日历
补充 iOS / macOS 系统自带「中国节假日」订阅中缺少的公共节日。
背景
Apple 官方的中国节假日订阅已覆盖春节、清明、劳动节、端午、中秋、国庆等传统节日,但缺少了许多公众普遍关注的节日,例如:
- 母亲节、父亲节、感恩节
- 情人节、平安夜、圣诞节
- 万圣节、愚人节
- 妇女节、青年节、教师节 等
本项目提供一份标准的 .ics 日历文件,可直接导入 iPhone、iPad、Mac 的日历应用,或作为 CalDAV/WebCal 订阅源长期使用。
包含节日
固定日期(每年自动重复)
| 节日 | 日期 |
|---|---|
| 情人节 | 2 月 14 日 |
| 妇女节 | 3 月 8 日 |
| 植树节 | 3 月 12 日 |
| 愚人节 | 4 月 1 日 |
| 青年节 | 5 月 4 日 |
| 教师节 | 9 月 10 日 |
| 万圣节 | 10 月 31 日 |
| 平安夜 | 12 月 24 日 |
| 圣诞节 | 12 月 25 日 |
浮动日期(按规则每年自动计算)
| 节日 | 规则 |
|---|---|
| 母亲节 | 5 月第二个星期日 |
| 父亲节 | 6 月第三个星期日 |
| 感恩节 | 11 月第四个星期四 |
使用方法
方式一:直接导入(推荐一次性使用)
- 下载
china-holidays-extra.ics文件 - 通过 AirDrop、微信、邮件等方式发送到 iPhone/iPad/Mac
- 点击文件,选择「添加全部」到日历
方式二:URL 订阅(推荐,可自动同步更新)
如果你将本项目部署在静态托管服务(如 GitHub Pages)上,可以直接订阅远程文件:
https://<your-domain>/china-holidays-extra.ics
iOS / iPadOS 操作步骤:
- 打开「设置」→「日历」→「账户」→「添加账户」→「其他」→「添加已订阅的日历」
- 在「服务器」中输入上述
.ics文件的完整 URL - 点击「下一步」→「存储」
macOS 操作步骤:
- 打开「日历」应用
- 菜单栏选择「文件」→「新建日历订阅」
- 输入
.ics文件的完整 URL,点击「订阅」
订阅后,若文件内容更新,客户端会自动同步最新节日数据。
文件说明
| 文件 | 说明 |
|---|---|
china-holidays-extra.ics |
标准 iCalendar 格式的日历文件,符合 RFC 5545 规范 |
generate_ics.py |
生成/更新 ics 文件的辅助脚本 |
技术细节
- 所有节日均使用
RRULE规则实现每年自动重复,无需手动更新固定日期节日 - 浮动日期节日(母亲节、父亲节、感恩节)使用
BYMONTH+BYDAY组合规则自动匹配每年正确日期 - 事件设置为全天事件(
VALUE=DATE),不会在日历中占用具体时间段 - 事件透明度设为
TRANSPARENT,不会显示为忙碌状态 - 文件使用 UTF-8 编码,CRLF 换行,兼容 Apple 日历、Google 日历、Outlook 等主流客户端
自定义与扩展
如需添加或修改节日,可编辑 generate_ics.py 中的节日列表,然后重新运行:
python3 generate_ics.py
脚本会自动重新生成 china-holidays-extra.ics。
具体代码如下:
import uuid
events = []
# 固定日期节日: (月日, 名称, 描述)
fixed_holidays = [
("0214", "情人节", "每年2月14日"),
("0308", "妇女节", "每年3月8日"),
("0312", "植树节", "每年3月12日"),
("0401", "愚人节", "每年4月1日"),
("0504", "青年节", "每年5月4日"),
("0910", "教师节", "每年9月10日"),
("1031", "万圣节", "每年10月31日"),
("1224", "平安夜", "每年12月24日"),
("1225", "圣诞节", "每年12月25日"),
]
for date_str, name, desc in fixed_holidays:
uid = str(uuid.uuid4())
# DTEND 是次日(全天事件的结束时间,不包含)
start = f"2025{date_str}"
# 简单计算次日
month = int(date_str[:2])
day = int(date_str[2:])
from datetime import datetime, timedelta
d = datetime(2025, month, day) + timedelta(days=1)
end = d.strftime("%Y%m%d")
events.append(f"""BEGIN:VEVENT
UID:{uid}
DTSTART;VALUE=DATE:{start}
DTEND;VALUE=DATE:{end}
RRULE:FREQ=YEARLY
SUMMARY:{name}
DESCRIPTION:{desc}
TRANSP:TRANSPARENT
END:VEVENT""")
# 浮动日期节日: (名称, 描述, RRULE, 起始日期)
floating_holidays = [
("母亲节", "每年5月第二个星期日", "FREQ=YEARLY;BYMONTH=5;BYDAY=2SU", "20250511"),
("父亲节", "每年6月第三个星期日", "FREQ=YEARLY;BYMONTH=6;BYDAY=3SU", "20250615"),
("感恩节", "每年11月第四个星期四", "FREQ=YEARLY;BYMONTH=11;BYDAY=4TH", "20251127"),
]
for name, desc, rrule, dtstart in floating_holidays:
uid = str(uuid.uuid4())
from datetime import datetime, timedelta
d = datetime.strptime(dtstart, "%Y%m%d") + timedelta(days=1)
end = d.strftime("%Y%m%d")
events.append(f"""BEGIN:VEVENT
UID:{uid}
DTSTART;VALUE=DATE:{dtstart}
DTEND;VALUE=DATE:{end}
RRULE:{rrule}
SUMMARY:{name}
DESCRIPTION:{desc}
TRANSP:TRANSPARENT
END:VEVENT""")
# 生成ics内容
ics_content = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//china-holidays-extra//CN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:中国节假日补充
X-WR-TIMEZONE:Asia/Shanghai
X-WR-CALDESC:补充iOS系统日历中缺少的中国公共节日,包括母亲节、父亲节、感恩节、情人节、圣诞节等
"""
for event in events:
ics_content += "\n" + event + "\n"
ics_content += "END:VCALENDAR\n"
with open("china-holidays-extra.ics", "w", encoding="utf-8", newline="\r\n") as f:
f.write(ics_content)
print("ics文件已生成")

