ICS日历标准(通常指 iCalendar 格式)是用于交换日历和日程安排的标准

好的,ICS日历标准(通常指 iCalendar 格式)是用于交换日历和日程安排信息的通用标准。它由RFC 5545定义,并由RFC 7986扩展。下面是对其核心要点的解读。

  1. 什么是iCalendar(.ics文件)?

· 本质:一种纯文本、结构化的数据格式,用于描述日历事件、待办事项、日记条目和空闲/繁忙信息。

· 文件扩展名:.ics

· MIME类型:text/calendar

· 目的:实现不同日历系统(如Google Calendar, Apple Calendar, Outlook, Thunderbird)之间的数据互操作。

  1. 核心结构与语法

一个.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类型。

  1. 关键概念与示例

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
  
  1. 重要注意事项

· 字符转义:属性值中的逗号,、分号;、反斜杠\需要转义为 ,、;、\。换行符转义为\n。

· 唯一性:UID 对于区分不同事件至关重要。更新事件时,应保持UID不变,并更新SEQUENCE和DTSTAMP。

· 文件头尾:必须包含 VCALENDAR 根组件和 VERSION:2.0。

· 编码:标准推荐使用UTF-8,但有时会遇到其他编码。CHARSET参数可用于指定。

· 行结束符:应为CRLF (\r\n),但许多解析器也接受LF (\n)。

· PRODID:标识创建此文件的软件,虽然不是绝对必须,但建议提供。

  1. 应用场景

· 日历订阅:Web上的.ics链接可以被添加到日历应用中,实现自动同步(如节假日、课程表)。

· 会议邀请与响应:通过邮件发送包含VEVENT、ATTENDEE和METHOD:REQUEST/REPLY的.ics文件。

· 数据备份与迁移:在不同日历服务间导出导入数据。

· 任务同步:通过VTODO组件同步待办事项。

· 服务器同步协议:CalDAV协议的核心数据格式。

总结

iCalendar标准通过简洁的文本格式,定义了丰富的日历信息描述能力。理解其组件-属性-参数的层次结构,以及掌握UID、DTSTART/DTEND、RRULE、VTIMEZONE等关键元素的用法,是正确生成和解析.ics文件的关键。对于开发者,可以使用成熟的库(如Python的icalendar、JavaScript的ical.js)来处理,避免手动处理复杂的细节和边缘情况。