iCalendar 日历事件生成

填好事件,导出一个 .ics 文件,双击就能加进 Outlook、Google 日历或 iPhone 日历。重复规则、全天事件和地点描述都支持。

事件

时间按你电脑的时区理解,写进文件时会换算成带 Z 的 UTC 时间。全天事件按日历日期处理,结束日期是不含的,所以填 20 日到 21 日表示只占 20 日这一天。

.ics 用什么打开

下载下来的文件扩展名是 .ics,双击一般会交给系统日历处理。Google 日历在「设置 → 导入和导出」里选文件导入;Outlook 拖进日历窗口或走「文件 → 打开和导出」;iPhone 直接点开附件就能加入日历。有些邮箱会把 .ics 当成附件预览,先存到本地再打开更稳妥。

为什么时间带个 Z

iCalendar 的规范叫 RFC 5545。时间有两种写法:一种带时区数据库(VTIMEZONE),一种直接用世界时 UTC,UTC 时间末尾加一个 Z。本页用后者,原因是 VTIMEZONE 要附带完整的夏令时切换历史,体积大且各家客户端实现差异也大;统一写 UTC 由客户端换算到本地时区,兼容性最好,也不会因为时区库过期而错一小时。

文件里还有两个必填字段。UID 是这条事件的唯一标识,导入时客户端靠它判断是新建还是更新,本页按内容生成稳定的 UID,同样的标题、时间和地点会得到同一个 UID,重复导入只会更新那一条,不会多出一堆。DTSTAMP 是生成这份文件的时间,等于是「这条记录什么时候产生的」。

折行和转义

和 vCard 一样,iCalendar 规定单行不超过 75 个八位组,超了要在 75 字节处折断,续行以空格开头。中文一个字 3 字节,描述写长一点就会折行,这是正常现象,不是文件坏了。另外描述里的分号、逗号和换行都要转义,换行写成 \n 的字面量,否则客户端会把它当成字段边界,事件内容会错位。

全天事件的坑

全天事件不写时间只写日期,而且规范里 DTEND 是「不含」的:DTSTART 是 10 月 20 日、DTEND 是 10 月 21 日,表示的才是「只占 10 月 20 日一天」。这是日历格式里最容易踩的坑,手写文件时少加一天会让事件在日历里凭空短一天。本页已经替你处理好了,只填开始日期就按一天算。