【问题标题】:How can I use the AEST timezone with Moment.js?如何在 Moment.js 中使用 AEST 时区?
【发布时间】:2014-01-12 06:48:08
【问题描述】:

我正在使用 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 是否遵循特定标准?有没有其他人遇到过缺少(或名称不同)时区的问题?

【问题讨论】:

  • AFAIK “AEST”在澳大利亚通常用于指代澳大利亚东部标准时间——我在那里期间在媒体节目、报纸和在线促销活动中看到过它。不确定 Moment.js 选择“Aus EST”作为名称背后的动机。

标签: javascript timezone momentjs


【解决方案1】:

来自时刻时区数据构建器的数据使用“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 作为缩写进行了冗长的讨论。但要点可以归结为:

  • 在澳大利亚,许多人只说“东部时间”而不是“澳大利亚东部时间”
  • 在美国,我们不会到处说“美国东部时间”,那他们为什么要这样说呢?
  • 即使我们这样做了,那么 both 也会是 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 不足以唯一标识时区。

【讨论】:

  • 出色的答案,感谢您花时间解释!
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2021-07-23
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2021-04-20
相关资源
最近更新 更多