Neatbo.

ICS 日历定义清单

检查本地 iCalendar 组件和事件声明,保留原始日期、时区、重复规则及重复属性。

浏览器本地处理输入ICS输出JSON / CSV单个文件最多 5 MiB · 最多 1 个
  1. 1添加输入
  2. 2调整设置
  3. 3获取结果

工具输入和文件在当前浏览器处理,不会上传。

输入内容

切换工具时在当前标签页临时保留输入。刷新或关闭后清除,较大的结果可能需要重新生成。

⌘ / Ctrl + Enter 运行

或将文件拖到这里

文件留在当前设备,原始文件不会被覆盖。

.ics · .txt

单个文件最多 5 MiB · 最多 1 个

    0 个字符 · 0 字节
    处理选项

    先填写标记为必填的选项,其余可保留默认值。

    正在准备处理工具…

    开始之前

    导入日历前先审查导出文件实际声明的内容,展开折行,查看事件、参与人、提醒和扩展属性;重复规则与时区规则保持声明形式。

    如何使用

    1. 打开 UTF-8 ICS 导出,或粘贴完整 VCALENDAR 对象。
    2. 查看组件、原始 DTSTART/DTEND/DURATION/CREATED/RRULE 声明,并在完整 JSON 中检查重复参与人属性。
    3. 下载 JSON 或组件 CSV,接收端的时区定义及重复实例行为需要另行确认。

    支持范围与限制

    一个 UTF-8 .ics 文件或粘贴日历,不超过 5 MiB。物理行和属性各最多 100,000 条,组件最多 10,000 个,嵌套深度最多 20。所选文件优先,去除 UTF-8 BOM;接受 LF/CRLF,拒绝仅 CR 换行和空物理内容行。

    要求一个 BEGIN/END 配对的 VCALENDAR 根组件及 VERSION:2.0。续行移除首个空格或制表符后拼接。组件错配、孤立续行、未闭合参数引号及不合法参数语法会使整次处理失败。这里是清单,不是完整 RFC 合规校验器。

    保留重复属性和参数声明,支持带引号的逗号、冒号、分号值。JSON 保留原始值与来源行号,已知 TEXT 属性解码反斜杠转义;参数的 ^ 编码、未知 VALUE 类型和扩展属性以原始声明保留。

    已知日期声明检查日期时间拼写,并标注 DATE、UTC、浮动或带 TZID 类型。不解析时区、不生成重复实例、不排程、不执行提醒或计算持续时间,也不展开 RRULE/EXDATE/RDATE。预览显示 200 个组件,JSON 保留全部属性,CSV 保留组件摘要。

    操作示例

    示例输入

    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Neatbo Fixture//EN
    BEGIN:VEVENT
    UID:event-1
    DTSTART;TZID=Europe/Paris:20261001T090000
    DTEND;TZID=Europe/Paris:20261001T100000
    SUMMARY:Planning\, team\nSecond
     line
    RRULE:FREQ=WEEKLY;COUNT=2
    ATTENDEE;CN="Ada, Example";ROLE=REQ-PARTICIPANT:mailto:[email protected]
    ATTENDEE;CN="张三":mailto:[email protected]
    BEGIN:VALARM
    TRIGGER:-PT15M
    ACTION:DISPLAY
    DESCRIPTION:Reminder
    END:VALARM
    END:VEVENT
    END:VCALENDAR
    
    示例参数
    {"params": {}}

    示例输出

    {
      "scope": "component definitions only; no recurrence expansion, timezone resolution or alarm execution",
      "components": [
        {
          "index": 1,
          "name": "VCALENDAR",
          "path": "/VCALENDAR[1]",
          "parent": null,
          "line": 1,
          "properties": [
            {
              "line": 2,
              "name": "VERSION",
              "parameters": [],
              "rawValue": "2.0",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            },
            {
              "line": 3,
              "name": "PRODID",
              "parameters": [],
              "rawValue": "-//Neatbo Fixture//EN",
              "decodedText": "-//Neatbo Fixture//EN",
              "valueKind": "text",
              "timeZone": null
            }
          ]
        },
        {
          "index": 2,
          "name": "VEVENT",
          "path": "/VCALENDAR[1]/VEVENT[2]",
          "parent": 1,
          "line": 4,
          "properties": [
            {
              "line": 5,
              "name": "UID",
              "parameters": [],
              "rawValue": "event-1",
              "decodedText": "event-1",
              "valueKind": "text",
              "timeZone": null
            },
            {
              "line": 6,
              "name": "DTSTART",
              "parameters": [
                {
                  "name": "TZID",
                  "values": [
                    "Europe/Paris"
                  ],
                  "raw": "TZID=Europe/Paris"
                }
              ],
              "rawValue": "20261001T090000",
              "decodedText": null,
              "valueKind": "zoned-date-time-declaration",
              "timeZone": "Europe/Paris"
            },
            {
              "line": 7,
              "name": "DTEND",
              "parameters": [
                {
                  "name": "TZID",
                  "values": [
                    "Europe/Paris"
                  ],
                  "raw": "TZID=Europe/Paris"
                }
              ],
              "rawValue": "20261001T100000",
              "decodedText": null,
              "valueKind": "zoned-date-time-declaration",
              "timeZone": "Europe/Paris"
            },
            {
              "line": 8,
              "name": "SUMMARY",
              "parameters": [],
              "rawValue": "Planning\\, team\\nSecondline",
              "decodedText": "Planning, team\nSecondline",
              "valueKind": "text",
              "timeZone": null
            },
            {
              "line": 10,
              "name": "RRULE",
              "parameters": [],
              "rawValue": "FREQ=WEEKLY;COUNT=2",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            },
            {
              "line": 11,
              "name": "ATTENDEE",
              "parameters": [
                {
                  "name": "CN",
                  "values": [
                    "Ada, Example"
                  ],
                  "raw": "CN=\"Ada, Example\""
                },
                {
                  "name": "ROLE",
                  "values": [
                    "REQ-PARTICIPANT"
                  ],
                  "raw": "ROLE=REQ-PARTICIPANT"
                }
              ],
              "rawValue": "mailto:[email protected]",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            },
            {
              "line": 12,
              "name": "ATTENDEE",
              "parameters": [
                {
                  "name": "CN",
                  "values": [
                    "张三"
                  ],
                  "raw": "CN=\"张三\""
                }
              ],
              "rawValue": "mailto:[email protected]",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            }
          ]
        },
        {
          "index": 3,
          "name": "VALARM",
          "path": "/VCALENDAR[1]/VEVENT[2]/VALARM[3]",
          "parent": 2,
          "line": 13,
          "properties": [
            {
              "line": 14,
              "name": "TRIGGER",
              "parameters": [],
              "rawValue": "-PT15M",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            },
            {
              "line": 15,
              "name": "ACTION",
              "parameters": [],
              "rawValue": "DISPLAY",
              "decodedText": null,
              "valueKind": "raw",
              "timeZone": null
            },
            {
              "line": 16,
              "name": "DESCRIPTION",
              "parameters": [],
              "rawValue": "Reminder",
              "decodedText": "Reminder",
              "valueKind": "text",
              "timeZone": null
            }
          ]
        }
      ]
    }

    出现问题时

    配对 BEGIN/END 组件名,补齐参数引号,修复孤立折行和已知日期格式。减少嵌套、组件或属性数量;切换粘贴输入前先移除所选文件。

    常见问题

    重复事件实例会计入事件数吗?

    不会。事件数只统计声明的 VEVENT 组件,RRULE 保留原文,不生成实例。

    会将带 TZID 的时间转换成 UTC 吗?

    不会。原始 TZID 和本地时间戳作为声明一起保留。

    未知组件和重复参与人会被丢掉吗?

    不会。组件和属性数组完整保留,包括重复项及扩展声明。

    文档与延伸阅读

    相关工具