iCal - TimeZone TZID 参数可以包含“:”字符吗?

iCal - can a TimeZone TZID parameter contain a ":" char?

在一个 c++ 项目中,我正在编写一个解析器来读取和写入 .ics 文件。为此,我针对来自多个来源(gmail、yahoo 等)的具有最大可能情况的多个文件测试了我的解析器。最近在一个测试文件中发现了一个让我有点困惑的情况,一直找不到满意的答案。

我的一个测试文件未能被我的解析器导入。导致问题的 VEVENT 包含以下开始日期:

DTSTART;TZID=GMT+04:00:20120103T120000

此事件与 VTIMEZONE 匹配,声明其 TZID 参数如下:

TZID:GMT+04:00

据我所知,“:”字符应​​该用作分隔符,我怀疑上述示例中的 VTIMEZONE 本身格式不正确,但我没有找到任何文档明确指出这种情况永远不会发生.我还注意到 Thunderbird 等几个应用程序也无法导入此文件,显然是出于同样的原因。

所以我的问题是:VTIMEZONE 中的 TZID 参数可以包含“:”字符吗?

此外,我不知道我是否应该使用 TZID 内容作为从 DTSTART 参数中提取 ISO 日期的密钥,或者我是否应该简单地拒绝此类事件,将其标记为已损坏,并显示一个输入后报错?

这方面的权威是RFC5545和相关小节: RFC5545 3.2.19. Time Zone Identifier

tzidparam = "TZID" "=" [tzidprefix] paramtext

RFC5545 3.1. Content Lines

param = param-name "=" param-value *("," param-value)
param-value = paramtext / quoted-string
paramtext = *SAFE-CHAR
[..]
SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E
/ NON-US-ASCII
; Any character except CONTROL, DQUOTE, ";", ":", ","

从中我们可以得出结论,时区 ID 参数不能包含“:”字符。