好的,ICS日历标准(通常指 iCalendar 格式)是用于交换日历和日程安排信息的通用标准。它由RFC 5545定义,并由RFC 7986扩展。下面是对其核心要点的解读。
- 什么是iCalendar(.ics文件)?
· 本质:一种纯文本、结构化的数据格式,用于描述日历事件、待办事项、日记条目和空闲/繁忙信息。
· 文件扩展名:.ics
· MIME类型:text/calendar
· 目的:实现不同日历系统(如Google Calendar, Apple Calendar, Outlook, Thunderbird)之间的数据互操作。
- 核心结构与语法
一个.ics文件是一个由 内容行(Content Lines) 组成的层次结构。其基本单位是 组件,组件内包含 属性。
A. 内容行
· 格式:属性名[;参数1=值1[;参数2=值2...]]:属性值
· 示例:DTSTART;TZID=Asia/Shanghai:20231001T090000
· 行折叠:单行长度不应超过75个字符。过长时,需在下一行以空格或制表符开头继续。
B. 组件
以 BEGIN: 开始,END: 结束。主要组件有:
· VEVENT:日历事件。
· VTODO:待办事项。
· VJOURNAL:日记。
· VFREEBUSY:表示忙闲状态。
· VTIMEZONE:定义时区信息。
· VALARM:闹钟提醒(必须嵌套在VEVENT或VTODO内)。
· VCALENDAR:根组件,整个文件必须以 BEGIN:VCALENDAR 开头,END:VCALENDAR 结尾。
C. 属性
定义组件的具体信息。一个属性由属性名、可选参数和属性值构成。
· 常用属性:
· DTSTART:事件开始时间。
· DTEND:事件结束时间。如果是全天事件,应使用VALUE=DATE。
· DUE:待办事项的截止日期。
· SUMMARY:事件标题。
· DESCRIPTION:详细描述。
· LOCATION:地点。
· UID:全局唯一标识符,是事件的“身份证”,必须唯一。
· DTSTAMP:创建或修改此事件的时间戳。
· CREATED:组件创建时间。
· LAST-MODIFIED:最后修改时间。
· RRULE、RDATE、EXDATE:定义重复规则、附加重复日期和排除日期。
· ATTENDEE、ORGANIZER:参与者和组织者(用于会议邀请)。
· STATUS:状态(如 CONFIRMED, TENTATIVE, CANCELLED)。
· CATEGORIES:分类。
· 属性参数:用于修饰属性。常见参数:
· VALUE:指定值的类型,如 DATE-TIME, DATE, DURATION, TEXT。
· TZID:指定时区标识符,如 TZID=Asia/Shanghai。
· ENCODING:编码方式,如 BASE64 用于附件。
· FMTTYPE:附件的MIME类型。
- 关键概念与示例
A. 一个简单的事件
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//CalDAV Client//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:12345-67890@example.com
DTSTAMP:20231001T080000Z
DTSTART:20231010T180000Z
DTEND:20231010T200000Z
SUMMARY:项目会议
DESCRIPTION:讨论Q4计划,请携带相关材料。
LOCATION:3号会议室
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
B. 全天事件
全天事件的 DTSTART 和 DTEND 的 VALUE 应为 DATE,且不包含时间。
DTSTART;VALUE=DATE:20231001
DTEND;VALUE=DATE:20231002 // 注意:全天事件的结束日是**不包含**的,即1号全天。
C. 重复事件 (RRULE)
RRULE 属性非常强大。
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20231225T000000Z
// 含义:每周一、三、五重复,直到2023年12月25日。
其他常见规则:
· FREQ=DAILY;INTERVAL=2:每2天一次。
· FREQ=MONTHLY;BYMONTHDAY=15:每月15号。
· FREQ=YEARLY;BYMONTH=7:每年7月。
D. 时区 (VTIMEZONE)
为了确保时间在全球范围内准确,建议为跨时区事件定义时区。
BEGIN:VTIMEZONE
TZID:Asia/Shanghai
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0800
TZOFFSETTO:+0800
END:STANDARD
END:VTIMEZONE
...
DTSTART;TZID=Asia/Shanghai:20231001T090000
E. 闹钟提醒 (VALARM)
BEGIN:VALARM
ACTION:DISPLAY // 动作:显示
TRIGGER:-PT15M // 触发时间:在事件开始前15分钟。PT15M = 15分钟时长。
DESCRIPTION:提醒
END:VALARM
- 重要注意事项
· 字符转义:属性值中的逗号,、分号;、反斜杠\需要转义为 ,、;、\。换行符转义为\n。
· 唯一性:UID 对于区分不同事件至关重要。更新事件时,应保持UID不变,并更新SEQUENCE和DTSTAMP。
· 文件头尾:必须包含 VCALENDAR 根组件和 VERSION:2.0。
· 编码:标准推荐使用UTF-8,但有时会遇到其他编码。CHARSET参数可用于指定。
· 行结束符:应为CRLF (\r\n),但许多解析器也接受LF (\n)。
· PRODID:标识创建此文件的软件,虽然不是绝对必须,但建议提供。
- 应用场景
· 日历订阅:Web上的.ics链接可以被添加到日历应用中,实现自动同步(如节假日、课程表)。
· 会议邀请与响应:通过邮件发送包含VEVENT、ATTENDEE和METHOD:REQUEST/REPLY的.ics文件。
· 数据备份与迁移:在不同日历服务间导出导入数据。
· 任务同步:通过VTODO组件同步待办事项。
· 服务器同步协议:CalDAV协议的核心数据格式。
总结
iCalendar标准通过简洁的文本格式,定义了丰富的日历信息描述能力。理解其组件-属性-参数的层次结构,以及掌握UID、DTSTART/DTEND、RRULE、VTIMEZONE等关键元素的用法,是正确生成和解析.ics文件的关键。对于开发者,可以使用成熟的库(如Python的icalendar、JavaScript的ical.js)来处理,避免手动处理复杂的细节和边缘情况。