填写标题、地点、日期和时间、时区、重复、受邀人、提醒和备注,然后下载 .ics 文件或直接在日历中打开。您也可以粘贴日程,或附加文档或照片,一次创建多个活动。
什么是 jCal,它与 .ics 文件有何不同?
jCal 是以 JSON 书写的 iCalendar,于 2014 年标准化为 RFC 7265。它承载的数据与 .ics 文件完全相同——相同的属性、参数和组件——只是用嵌套数组而非对象来表示,因为一个组件中的属性可能重复出现,且顺序可能具有意义。一个日历是 ["vcalendar", [属性], [组件]],每个属性是 [名称, 参数, 值类型, 值],因此 SUMMARY:Standup 会变成 ["summary", {}, "text", "Standup"]。它与用于搜索引擎的 JSON-LD 中的 schema.org Event 并不相同,后者所保留的信息要少得多。ICS Maker 是从同一个事件模型直接写出 .ics 和 jCal,而不是在两者之间相互转换,因此这两种格式不会在事件内容上产生分歧。
结构形态
RFC 7265 将 iCalendar 映射为数组而非对象,因为在日历中顺序和重复都很重要,而 JSON 对象两者都无法保证。一个日历是 ["vcalendar", [properties], [components]],每个属性是 [name, parameters, valueType, value]——名称使用小写,参数是一个对象,类型则是 RFC 5545 值类型之一。
因此 SUMMARY:Standup 会变成 ["summary", {}, "text", "Standup"],而带时区的开始时间会变成 ["dtstart", {"tzid":"Europe/London"}, "date-time", "2026-08-15T09:00:00"]。这里的日期时间采用的是 ISO 拼写方式,而非 iCalendar 的紧凑格式,时区则被移入了参数中。
它的价值所在
iCalendar 是一种带有折行规则、转义规则和 CRLF 换行符的文本格式,要正确解析它比看上去要费劲得多。jCal 把同样的语义——时区、重复规则、提醒、与会者——交给任何已经能处理 JSON 的系统,无需再编写解析器。这与本页面同样可以生成的 schema.org 的 Event 是不同的用途:JSON-LD 是为搜索引擎描述一个事件,会略去日历所需的大部分信息。
本页面如何生成它
这两种格式都是从同一个事件写出的,而不是相互转换而来。若采用转换方式,就会继承文本格式中的所有转义决定,而 jCal 的值是明确不转义的——JSON 有自己的一套引用规则。从同一个模型分别写出两种格式,意味着它们在事件内容上不会产生分歧,只会在书写方式上有所不同。
常见问题
- 什么是 jCal?
- jCal 是 iCalendar 的 JSON 格式,于 2014 年标准化为 RFC 7265。它使用嵌套的 JSON 数组,表示与 .ics 文件完全相同的数据——相同的属性、参数和组件——因此可以在两种格式之间双向转换而不丢失信息。
- jCal 和 JSON-LD 或 schema.org Event 是一回事吗?
- 不是。jCal 是对 iCalendar 的完整映射,因此它承载重复规则、时区、提醒以及与会者的参与状态。JSON-LD 中的 schema.org Event 是面向搜索引擎和其他读取者对事件的描述,特意保留的信息要少得多。本构建器会从同一个事件同时生成这两种格式。
- 为什么 jCal 使用数组而不是对象?
- 因为一个日历组件可以多次携带同一属性——比如多个与会者、多个例外日期——而且顺序可能具有意义。以属性名为键的 JSON 对象无法表示这两种情况,因此 RFC 7265 改用基于位置的数组。
- 哪些程序会读取 jCal?
- 这是一种小众格式,在 ical.js 等 JavaScript 日历库中得到了良好支持,一些服务器端的 iCalendar 工具包也支持它。主流日历应用仍然默认使用 .ics,因此建议在自有系统之间使用 jCal,而向用户提供的则是 .ics 文件。