【问题标题】:Get UTC time given TZID and local time获取给定 TZID 和本地时间的 UTC 时间
【发布时间】:2014-03-03 01:06:37
【问题描述】:

我正在尝试解析我的应用程序中的 .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 并考虑遵守吗?

【问题讨论】:

    标签: javascript timezone icalendar momentjs rfc5545


    【解决方案1】:

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

    本文档未定义命名约定 时区标识符。实施者可能想要使用命名 现有时区规范中定义的约定,例如 作为公共域 TZ 数据库 [TZDB]。规格 全球唯一的时区标识符不由此解决 文件,留待以后研究。

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2018-07-02
      • 2014-09-15
      • 2012-10-08
      • 1970-01-01
      • 2013-01-04
      • 2012-09-23
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多