iCalendar (ICS) 到 JSON 转换器
指导
iCalendar (ICS) 到 JSON 转换器
iCalendar (ICS) 到 JSON 转换器会将符合 RFC 5545 格式的日历内容解析为结构化的 JSON 数据,您可以阅读、转换或将其输入到其他程序中。请将从 Google 日历、Apple 日历或 Outlook 导出的 .ics 文件内容粘贴到输入框中,或直接拖放文件到上传区域。该工具会在您的浏览器中展开长行内容,解码文本值,将属性参数与值分离,将 DTSTART 和 DTEND 解析为 ISO 8601 格式,并将 RRULE 转换为结构化对象——所有操作均在本地浏览器中完成,不会上传至服务器。
如何使用
- 将 .ics 文件的内容粘贴到输入框中,或直接拖放文件到上传区域。
- 选择您的输出选项:美化格式、扁平化的事件数组、ISO 8601 日期解析,或同时包含原始属性值和解析后的值。
- 可选地启用 RRULE 预览功能,以查看任何重复事件的前 N 个实例。
- 复制 JSON 输出结果或下载为
calendar.json.
特征
- 符合 RFC 5545 的展开格式 – 重新连接以空格开头的续行,确保 DESCRIPTION 和 URL 值被正确重建。
- 属性参数被保留 – TZID、CN、RSVP、VALUE 以及任何 X- 参数都会被保留在值旁边的一个结构化对象中。
params对象 - 日期解析 – DTSTART、DTEND、DTSTAMP、CREATED、LAST-MODIFIED、RECURRENCE-ID 和 DUE 都会被转换为 ISO 8601 格式,并带有日期仅、UTC 和 TZID 绑定值的标记。
- RRULE 作为对象 – FREQ、INTERVAL、COUNT、UNTIL、BYDAY、BYMONTH 等参数会被解析为结构化对象,而不是一个单一的不可读字符串。
- VTIMEZONE 和 VALARM 保持不变 – 嵌套组件会被作为数组发布到其父级 VCALENDAR 或 VEVENT 中。
components数组位于其父级VCALENDAR或VEVENT中。 - 组织者和参与者地址 – mailto: 前缀会被移除并放入一个字段中,同时保留原始地址。
email字段的同时保留原始内容calAddress. - 重复规则预览 – 可选地将 DAILY、WEEKLY(带 BYDAY)、MONTHLY 和 YEARLY 规则扩展为前 N 个实例,以便快速查看。
- 仅客户端 – 文件在您的浏览器中被解析。日历内容永远不会离开您的设备。
何时使用此工具
当您需要程序化地读取日历数据时,请使用此转换器——例如比较两个 .ics 导出文件、将事件加载到电子表格中、为聊天机器人预处理会议,或审计导出的预约实际包含的内容。与原始的折行 iCalendar 文本相比,JSON 更容易进行 grep 搜索、验证,并将其传递给其他工具。
常问问题
-
什么是 RFC 5545,以及它在解析 .ics 文件时为何重要?
RFC 5545 是定义 Google 日历、Apple 日历、Outlook 和大多数日历应用所使用的 iCalendar 数据格式的规范。它定义了属性名称、参数语法、值类型、75 字节的行折叠规则、文本值中的转义、重复规则(RRULE)以及通过 VTIMEZONE 块引用时区的方法。正确解析 .ics 文件意味着处理所有这些内容——简单地按换行符或逗号分割会遗漏转义序列和折叠的延续行。
-
iCalendar 内容中的行折叠是什么?
行折叠规则规定,任何超过 75 字节的内容行都必须跨多行拆分,每行延续部分必须以单个空白字符(空格或制表符)开头。在读取 .ics 文件时,必须在解析前重新连接这些折叠行,否则长描述、URL 和重复规则将被截断,导致属性值损坏。
-
VTIMEZONE 如何与 DTSTART 和 DTEND 相关?
DTSTART 和 DTEND 可以携带 TZID 参数,该参数引用日历中定义的 VTIMEZONE 块。VTIMEZONE 块描述了该时区的 UTC 偏移及其夏令时转换规则,因此日历中写入的墙钟时间可以被解析为精确的 UTC 时间点。带有尾随 Z 的时间已经处于 UTC,而没有 TZID 且没有 Z 的时间是浮动的——它们应显示在读者所在时区。
-
为什么 SUMMARY 和 DESCRIPTION 中的逗号、分号和换行符需要转义?
在文本值内部,逗号、分号和反斜杠,以及字面意义上的换行符具有更高层次的结构意义:逗号用于分隔列表项,分号用于分隔参数,换行符用于结束内容行。RFC 5545 §3.3.11 保留了 \\、\,、\; 和 \n(或 \N)的转义序列,以便作者可以在值中包含这些字符。解析器必须在拆分行后反转这些转义,而不是在拆分前。
-
什么是 RRULE,它与显式日期列表有何不同?
RRULE 编码一个重复模式——例如 FREQ=WEEKLY;BYDAY=MO,WE;COUNT=10 表示每周一和周三各发生 10 次。它是一个紧凑的指令,日历应用会将其扩展为具体的实例。RDATE 和 EXDATE 与 RRULE 互补:RDATE 为系列添加额外的显式日期,EXDATE 则从系列中移除特定日期。它们共同以少数几行描述复杂的日历(如节假日、锚定例外)。
