0

我正在尝试解析我的应用程序中的 .ics 文件。我的应用程序有服务器端 java 层和客户端 javascript 部分。我正在使用 ical4j 库来解析它。

问题是事件的 DTSTART 有时不是 UTC 格式。并且每当它不在 UTC .ics 文件中时,我都会解析并从中获取 TZID 属性的 VTIMEZONE 组件。

Java 层最终将 JSON 发送到客户端。在上述情况下,DTSTART、DTEND 和 TZID 以 JSON 格式发送。

客户端必须使用 TZID 将 DTSTART 和 DTEND 转换为 UTC。我尝试使用 moment.js,因为我找不到任何其他可以做到这一点的 api。

moment.tz("2014-02-06 05:30", "NorthAmerica/Eastern").format()

下面的 moment.js 是我得到的错误,

TypeError: Cannot call method 'rule' of undefined

但下面的代码工作正常,

moment.tz("2014-02-06 17:30", "America/Toronto").format()

不能从 .ics 文件中按原样使用 TZID(即 NorthAmerica/Eastern)吗?还有其他方法或 JS 库可以为我提供所有时区的 UTC 并考虑遵守吗?

4

1 回答 1

1

您应该知道 icalendar 规范 RFC5545 在TZID中明确指出:

本文档未定义时区标识符的命名约定。实施者可能希望使用现有时区规范中定义的命名约定,例如公共域 TZ 数据库 [TZDB]。本文档未解决全球唯一时区标识符的规范,留待未来研究。

很明显,虽然America/Toronto列在 Olsson 数据库中(请参见此处),America/Eastern但这并不能解释为什么您的 JS 库无法识别它。

对于健壮的设计,您需要在服务器端转换为 UTC,或者拥有一个能够解析 ICSVTIMEZONE组件的实际 JS 类。

于 2014-02-06T15:20:01.070 回答