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

goo*_*rgy 1 javascript timezone momentjs

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

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

{ 
    "start": "2013-12-10T09:00:00Z",
    "end": "2013-12-10T11:00:00Z",
    "timezone": "AEST"
}
Run Code Online (Sandbox Code Playgroud)

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

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'));
Run Code Online (Sandbox Code Playgroud)

但是'AEST'不在我从Moment.js时区数据构建器中检索的时区数据中 - 而是"Aus EST".AEST似乎是一个常见的缩写(根据这个维基百科页面,至少).

Moment.js遵循特定的标准吗?有没有其他人遇到缺少(或命名不同)时区的问题?

Mat*_*int 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": {}
});
Run Code Online (Sandbox Code Playgroud)

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

此数据直接来自IANA/Olson时区数据库.Moment.js只是将其编译为更紧凑的JSON格式.您可以在这里找到澳大利亚的原始规则.

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

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

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

因此,一般而言,除了显示之外,您不能依赖时区缩写.您不应该传递"AEST"JSON数据.相反,传递"Australia/Brisbane",或任何实际的IANA/Olson时区标识符.您可以在此处找到有效区域标识符的完整列表.您也可以在这里查看澳大利亚的具体细节.

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

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