Javascript 如何缩短从moment.js获得的时区名称列表?
我使用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.tz.names()
)检索时区名称列表,该列表列举了世界上500多个城市。长列表使得用户选择所需时区的效率不高。问题在于是否有办法缩小列表的规模,即将同一时区的城市分组 我认为这不是一个技术问题,而是一个设计问题。在下拉列表中显示500多个城市不是好的UI设计
以下是一些替代方法:
['CST','EST',…]
或['UTC','UTC+1',…]
我希望这能对您有所帮助。这是在纽约的时刻时区待办事项 下面是我在那里提供的临时解决方法,它将把列表缩短到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,
}));