填写标题、地点、日期和时间、时区、重复、受邀人、提醒和备注,然后下载 .ics 文件或直接在日历中打开。您也可以粘贴日程,或附加文档或照片,一次创建多个活动。
为什么我的日历事件差了一小时,或者差了一天?
.ics 文件可以用三种方式表示时间,出错的原因几乎总是选错了方式。浮动时间(DTSTART:20260815T090000,无时区)无论在哪里打开都是九点。UTC 时间(末尾带 Z)表示一个绝对时刻。命名时区(DTSTART;TZID=Europe/London:...)表示的是一个即使经历夏令时切换、本地时钟时间也保持不变的时刻。偏差一小时的导入问题通常是因为使用了 Windows 风格的时区名称(比如“GMT Standard Time”),而读取日历无法识别,于是回退为 UTC;偏差一天的全天事件问题,通常是因为本该使用 VALUE=DATE 的地方写成了午夜时间戳,或者是结束日期写在了最后一天而不是次日,因为 DTEND 是不包含当天的(即排他性的)。ICS Maker 默认写入浮动时间,选定时区时则写入指向 IANA 时区名称的 TZID——但不附带 VTIMEZONE 数据块,因为主流日历都能直接根据时区名称自行解析。
文件表示时间的三种方式
- 浮动时间——完全没有时区
DTSTART:20260815T090000。无论在哪里打开都是早上九点。适用于本地约会、提醒事项,或任何以阅读者自己的时钟为准的事情;但一旦两个身处不同国家的人需要碰面,这种方式就不合适了。- UTC——一个绝对时刻
DTSTART:20260815T090000Z,末尾带Z。这是时间轴上的一个确定时刻,由打开它的程序转换为本地时间。它没有歧义,但会丢失“伦敦时间十点”这一事实,因此夏令时变化会让它发生偏移。- 命名时区——一个能扛过夏令时切换的时刻
DTSTART;TZID=Europe/London:20260815T090000。这正是周期性会议所需要的:即使底层的时区偏移发生变化,这一系列会议仍然保持在当地时间十点。RFC 5545 要求随附一个匹配的VTIMEZONE数据块,定义该时区的偏移量。
本构建工具默认写入第一种方式,当你从列表中选择时区时则写入第三种方式。这个默认设置是有意为之:牙医预约的九点就应该是九点,如果把构建文件所在机器的时区附加进去,反而会让读取者看到的事件时间偏差一小时。
它写入 TZID 时不附带 VTIMEZONE 数据块,这一点在你把文件发送到不常见的场合之前值得了解。Apple 日历、Google 日历、Outlook 和 Thunderbird 都内置了 IANA 时区数据库,仅凭名称就能解析出 Europe/London,因此该数据块会是几百行重复读取者已经知道的信息。只有当解析器严格到只解析文件本身定义的时区时,省略这个数据块才会带来问题——如果你要提供给这样的解析器,请手动粘贴一个 VTIMEZONE 数据块进去。
解读一份时间不对的文件
用文本编辑器打开它,查看 DTSTART 这一行,因为答案总是在那里。如果末尾带有一个你没预料到的偏移量的 Z,说明发件人是从你并不使用的时区转换成了 UTC。如果 TZID 使用的名称类似 GMT Standard Time 而不是 Europe/London,那是 Microsoft Exchange 的命名方式,而只认识 IANA 名称的日历可能会回退为 UTC——这正是导致偏差一小时的经典导入问题。如果 TZID 指定的时区既不是 IANA 名称,也没有在同一文件中通过 VTIMEZONE 数据块定义,那么每个读取程序的猜测方式都会不同,而且经常猜成 UTC,这也是应该检查的第二个方面。
偏差一天的全天事件
全天事件是一个日期,而不是一个时间:DTSTART;VALUE=DATE:20260815。如果写成午夜时间戳,它就变成了一个真实的时刻,任何向西方向的时区转换都会把它拖到前一天。结束日期是这个陷阱的另一半——它是排他性的,因此 15 号这一天的单日事件应以 16 号作为结束日期,如果文件把结束日期写成 15 号,某些日历会完全不显示这个事件。
常见问题
- 为什么我的日历事件差了一小时?
- 几乎总是夏令时不匹配造成的:文件指定了一个固定的 UTC 偏移量,或者使用了读取日历无法识别的 Windows 风格时区名称,导致读取程序回退为 UTC。请检查 DTSTART 这一行——如果末尾是 Z,则时间是绝对 UTC 时间;如果带有 TZID,该时区必须写成类似 Europe/Paris 这样的 IANA 名称,否则就需要在同一文件中通过 VTIMEZONE 数据块加以定义。主流日历会根据自身内置的时区数据库副本解析 IANA 名称,因此不需要这样的数据块。
- 我应该设置时区,还是不设置?
- 如果事件是由本地时钟时间决定的——比如一次约会、一个提醒事项、一堂无论身处何地都在九点开始的课程——就不要设置时区。如果事件发生在一个单一时刻,其他时区的宾客都需要将其转换为自己的时间,比如一通电话、一场网络研讨会或一次直播,那就应该设置时区。
- 什么是浮动时间?
- 浮动时间是指没有时区、末尾也没有 Z 的日期时间写法,RFC 5545 规定应将其解释为读取当地的本地时间。它比人们通常以为的更常是正确的选择,但只要两个身处不同时区的读取者需要就同一时刻达成一致,它就是错误的选择。
- 为什么我的全天事件显示在了错误的日期上?
- 因为它被写成了午夜的时间戳,而不是日期值。真正的全天事件应使用不带任何时间的 VALUE=DATE,这样就没有什么可供转换的了。另外还要记住,结束日期是排他性的:15 号这一天的单日事件,其 DTEND 应为 16 号。