我正在使用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遵循特定标准吗?是否有其他人遇到过丢失(或命名不同)时区的问题?
答案 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作为缩写的长篇讨论。但这些要点可以归结为:
这实际上只是没有时区缩写标准的一个例子。还有许多其他冲突,例如“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不足以唯一地识别时区。