Javascript 如何缩短从moment.js获得的时区名称列表?

Javascript 如何缩短从moment.js获得的时区名称列表?,javascript,timezone,momentjs,Javascript,Timezone,Momentjs,我使用moment.js(我使用的方法是moment.tz.names())检索时区名称列表,该列表列举了世界上500多个城市。长列表使得用户选择所需时区的效率不高。问题在于是否有办法缩小列表的规模,即将同一时区的城市分组 我认为这不是一个技术问题,而是一个设计问题。在下拉列表中显示500多个城市不是好的UI设计 以下是一些替代方法: 显示时区缩写,例如['CST','EST',…]或['UTC','UTC+1',…] 保持一个缩短的时区列表。对于每个时区,显示2-3个最著名的城市。请参阅Win

我使用moment.js(我使用的方法是
moment.tz.names()
)检索时区名称列表,该列表列举了世界上500多个城市。长列表使得用户选择所需时区的效率不高。问题在于是否有办法缩小列表的规模,即将同一时区的城市分组

我认为这不是一个技术问题,而是一个设计问题。在下拉列表中显示500多个城市不是好的UI设计

以下是一些替代方法:

  • 显示时区缩写,例如
    ['CST','EST',…]
    ['UTC','UTC+1',…]
  • 保持一个缩短的时区列表。对于每个时区,显示2-3个最著名的城市。请参阅Windows的时区设置

  • 我希望这能对您有所帮助。

    这是在纽约的时刻时区待办事项

    下面是我在那里提供的临时解决方法,它将把列表缩短到365个区域标识符

    var names = Object.keys(moment.tz._zones)
        .map(function(k) { return moment.tz._zones[k].split('|')[0]; })
        .filter(function(z) { return z.indexOf('/') >= 0; })
        .sort();
    
    这将从列表中删除链接和缩写区域。我们认识到这仍然不理想,并将在未来的版本中对此进行改进。

    以下是另一个答案中提到的


    如果其他人想过滤掉不推荐使用的时区:

    const depricatedTimeZones = ["UCT", "PST8PDT", "GB", "MST7MDT", "EST5EDT", "W-SU", "CST6CDT", "HST", "MST", "Universal", "EET", "WET", "EST", "CET", "MET", "GMT", "Etc"];
    const depricatedTimeZonesRegex = `^${depricatedTimeZones.join("|^")}`;
    
    const allowedTimeZones = moment.tz.names()
        .filter(timezone => timezone.startsWith("A") || !new RegExp(depricatedTimeZonesRegex).test(timezone))
        .sort((timezoneA, timezoneB) => timezoneA.localeCompare(timezoneB))
        .map(timezone => ({
            timezone,
        }));
    

    在前端使用react select(或类似的东西)进行选择,这样做很好。

    仅仅因为它们当前具有相同的时区偏移量,并不意味着它们位于相同的时区。你只是想把这当作一个两步走的过程吗?您是要获取用户的当前时区,还是另一个时区?因为如果查看
    moment.tz.names()
    的输出,时区列表中会有一些重复项。我可以通过js获得客户端时区,但我想让用户在旅行时选择另一个首选时区。你能给出重复的例子吗?(无可否认,我想可能有一些是反向链接。)我只是担心你确定时区重复的方法可能不正确。但这取决于你的目标-从现在起,许多时区将是等效的“但历史上并不等效。例如,美国/亚利桑那州和美国/凤凰城是重复的。凤凰城在亚利桑那州。我只想为最终用户列出一个更简单的列表。对-在这种情况下,这是一个别名(在IANA数据的“后退”文件中).但是卡萨布兰卡和伦敦目前有相同的偏移量,但不是同一时区-这是你需要避免的事情。如果在矩.js中有什么东西可以给出“规范的“ID,为了避免重复,这是您真正需要的。是的,windows时区列表正是我想要的。很好的参考!谢谢你的解决办法。应用代码更改后,列表大小缩小到220。我发现这个对象
    moment.tz.\u zones[k]
    很奇怪。有时是字符串,有时是数组。所以我必须在使用它之前添加逻辑判断。我正在使用最新版本的moment.js和moment-timezone.js.FYI-时区选择通常是一个很难解决的UX问题。如果你想变得花哨的话,这里有实际上最好的方法是两个下拉列表。一个用于国家,一个用于国家内的时区。矩时区最终将能够支持这方面的数据。本地化是很难的。是的,这些都是很好的方法。我一直在考虑使用文本字段匹配输入关键字来自动完成输入。啊,但是你必须考虑用户如何描述他们的时区。即使你仅限于英语,变化也会很繁重。不过这个主意很有趣。
    const depricatedTimeZones = ["UCT", "PST8PDT", "GB", "MST7MDT", "EST5EDT", "W-SU", "CST6CDT", "HST", "MST", "Universal", "EET", "WET", "EST", "CET", "MET", "GMT", "Etc"];
    const depricatedTimeZonesRegex = `^${depricatedTimeZones.join("|^")}`;
    
    const allowedTimeZones = moment.tz.names()
        .filter(timezone => timezone.startsWith("A") || !new RegExp(depricatedTimeZonesRegex).test(timezone))
        .sort((timezoneA, timezoneB) => timezoneA.localeCompare(timezoneB))
        .map(timezone => ({
            timezone,
        }));