如何将AEST时区与Moment.js一起使用?

时间:2013-12-24 02:05:26

标签: javascript timezone momentjs

我正在使用moment.js将时区中的给定时间转换为当前时区中的同一时间。

我的数据以下列格式指定:

{ 
    "start": "2013-12-10T09:00:00Z",
    "end": "2013-12-10T11:00:00Z",
    "timezone": "AEST"
}

我可以成功地将指定格式的时刻转换为我当前的时区,例如:

var time = moment('2013-12-24T09:00:00Z').tz('Europe/London');
console.log(time.format('DD-MMM-YYYY'));
console.log(time.format('h:mm:ss a'));

但'AEST'不在我从Moment.js timezone data builder检索到的时区数据中 - 而是“Aus EST”。 AEST似乎是一个常见的缩写(至少根据this Wikipedia page)。

Moment.js遵循特定标准吗?是否有其他人遇到过丢失(或命名不同)时区的问题?

1 个答案:

答案 0 :(得分:6)

来自时刻 - 时区数据构建器的数据使用“Aus EST”作为时区缩写。我相信你很困惑,因为你看到的是这样的事情:

moment.tz.add({
    "zones": {
        "Australia/Brisbane": [
            "10:12:8 - LMT 1895 10:12:8",
            "10 Aus EST 1971 10",
            "10 AQ EST"
        ]
    },
    "rules": {
        "Aus": [
            "1917 1917 0 1 7 0:1 0 1",
            "1917 1917 2 25 7 2 0 0",
            "1942 1942 0 1 7 2 0 1",
            "1942 1942 2 29 7 2 0 0",
            "1942 1942 8 27 7 2 0 1",
            "1943 1944 2 0 8 2 0 0",
            "1943 1943 9 3 7 2 0 1"
        ],
        "AQ": [
            "1971 1971 9 0 8 2 2 1",
            "1972 1972 1 0 8 2 2 0",
            "1989 1991 9 0 8 2 2 1",
            "1990 1992 2 1 0 2 2 0"
        ]
    },
    "links": {}
});

这里的"Aus"指的是标有“Aus”的内部规则,所用的缩写就是EST。您还可以看到此区域有第二条规则,标记为"AQ"。这些规则名称只是标签,因此区域数据可以引用它们。您不应该关注规则名称,只需注意区域名称本身,例如此处显示的"Australia/Brisbane"

此数据直接来自IANA/Olson time zone database。 Moment.js只是将其编译为更紧凑的JSON格式。您可以找到澳大利亚here的原始规则。

如果您愿意,您可以阅读该文件中的评论,该文件有关是否使用AEST或EST作为缩写的长篇讨论。但这些要点可以归结为:

  • 在澳大利亚,很多人只是说“东部时间”而不是“澳大利亚东部时间”
  • 在美国,我们不会说“美国东部时间”,为什么要这样呢?
  • 即使我们这样做了,那么这两个都是AEST,所以这无济于事。

这实际上只是没有时区缩写标准的一个例子。还有许多其他冲突,例如“CST”至少有5种不同含义,“IST”至少有3种,还有许多其他冲突。在一个地区甚至存在冲突,例如夏威夷,其经常标记为“HST”,但在法律上是“HAST”(夏威夷 - 阿留申标准时间)。如果您想要更多示例,可以浏览this list of abbreviations

因此,一般来说,除了显示之外,您不能依赖时区缩写。您不应该在JSON数据中传递"AEST"。相反,传递"Australia/Brisbane"或任何实际的IANA / Olson时区标识符。您可以找到有效区域标识符here的完整列表。您还可以查看澳大利亚here的详细信息。

如果您的数据来自第三方,您应该要求他们相应地更改其API,因此它实际上可以使用。

“AEST”不是一个好标识符的另一个原因是像Australia/Brisbane这样的区域全年使用它,而像Australia/Sydney这样的区域在冬季使用AEST,而在夏季使用AEDT 。所以只是让AEST不足以唯一地识别时区。