Javascript 与IANA名称相对应的用户友好时区名称

Javascript 与IANA名称相对应的用户友好时区名称,javascript,datetime,ecmascript-6,momentjs,Javascript,Datetime,Ecmascript 6,Momentjs,我试图找到一个用户友好的时区列表,供用户选择 选择他们当前的时区。它将有一个共同的名称,如时区 太平洋时间(美国和加拿大) 此列表应将文本映射到IANA标准名称,如美国/洛杉矶 它还将删除用户认为“相同”时区的列表。例如,太平洋时间(美国和加拿大)的列表将对应于美国/洛杉矶和美国/蒂华纳,它们是“相同”的时间 我试着在图书馆里找,像这样。他们可以将IANA名称解析为通用名称,例如America/Los_Angeles==>“太平洋标准时间”但没有一个内置函数来列出所有常用名称及其对应的IANA名

我试图找到一个用户友好的时区列表,供用户选择 选择他们当前的时区。它将有一个共同的名称,如时区 太平洋时间(美国和加拿大)

此列表应将文本映射到IANA标准名称,如美国/洛杉矶

它还将删除用户认为“相同”时区的列表。例如,太平洋时间(美国和加拿大)的列表将对应于美国/洛杉矶和美国/蒂华纳,它们是“相同”的时间


我试着在图书馆里找,像这样。他们可以将IANA名称解析为通用名称,例如
America/Los_Angeles
==>
“太平洋标准时间”
但没有一个内置函数来列出所有常用名称及其对应的IANA名称。

简而言之,没有从IANA代表位置名称到常用名称的简单地图,因为IANA名称不反映偏移或夏令时的历史变化,无论是官方还是事实上,通用名称也没有充分标准化

长话短说 IANA的代表性位置包括时区偏移的历史变化,包括当地时间和夏时制,因为多年来一直在使用。标准时区名称可能没有更改,但是偏移量已经更改并将继续更改。此外,IANA代表性位置名称在夏时制期间保持不变,但偏移量和通用名称则不同

例如,萨摩亚的IANA名称为“太平洋/萨摩亚”。2011年12月29日之前的标准偏移量为UTC−11:00之后,其偏移量为UTC+13:00,夏令时从UTC-1000变为UTC+14:00。其时区的通用名称为“萨摩亚标准时间”和“萨摩亚夏令时”,但这些名称未标准化,在许多地方模棱两可(例如,CST可能是2或3个不同地方的中央标准时间,或中国标准时间)

因此,对于所有IANA位置,并没有从IANA代表位置名称到通用时区名称的简单映射。您可以为一小部分创建一个,但是使用内置的Intl对象可能更简单,例如

let opts={
小时:'数字',
分钟:'2位',
时区:“太平洋/萨摩亚”,
时区名称:“长”
};
让时间=新日期().toLocaleString('en',opts);

log('目前在萨摩亚是'+时间')您计划如何使用此名称列表?这个问题的答案将有助于确定检索和处理您正在查找的列表的最佳方式。例如,如果需要一次性转储,最简单的方法可能是将IANA名称和常用名称的当前列表导入数据库,并以所需格式导出数据。OTOH,如果您想要一个不断更新的列表,您必须找到一个提供信息的API。@kmoser一次性转储很好。这些名称将用作下拉选项。当用户在我的网站上注册时,我会检测他们的时区,以设置一个默认选项,如果需要,他们可以更新该选项。简单的部分是检测时区,这是一个简单的API调用。棘手的部分是将所有300多个IANA名称映射到100个简化的下拉选项。这很棘手,因为一个下拉选项对应许多IANA字符串。@kmoser我从Zoom API文档中找到了这个IANA名称和常用名称表:但它缺少很多IANA名称。如果检测到的时区名称与这些ID中的任何一个不匹配,会发生什么情况?你能写一条规则来处理吗?这条规则是什么?@yogadog,这个列表几乎完全没有时区名称。它只包括少量标准的北美通用名称,没有夏令时通用名称。@RobG-True。但是下拉选项≠ 时区名称。例如,当用户选择“时区”时,他不会从“太平洋夏令时”和“太平洋标准时间”中进行选择。相反,该下拉列表使用一个标识符,如Pacific(美国和加拿大),并在适当时以PDT和PST打印他的约会。下拉选项不需要以时区名称命名。目标是创建一个合理的下拉列表供用户选择。有什么想法吗?谢谢!这很有帮助。当用户在我的网站上注册时,我会自动检测他们的时区,以便为他们设置一个合理的默认时区。但是如果Intl对象检测到的时区与我的任何时区下拉选项都不匹配怎么办?我该怎么办?听起来像是另一个问题。询问用户地理位置,然后将其映射到IANA代表位置,或者只给他们IANA位置供选择。始终反映结果,例如,立即向他们显示日期和时间以及要使用的偏移量和时区名称。然后他们可以确认它是合适的,并更改他们的选择,直到得到正确的结果。您可能还应该显示一个6个月的轮班时间,以显示DST时区名称将是什么样子(准备好它会出错)。