来自时刻时区数据构建器的数据不使用“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 不足以唯一标识时区。