我有一个应用程序可以帮助用户预订会议(活动)。我必须为用户提供选择他/她自己的时区的机会,以便准确地计划和更改活动日期以及显示他/她的日程安排。我找到了包含近 400 个时区的 IANA 列表。我应该使用什么时区来覆盖尽可能多的用户。根据我的想法,用户不必寻找他/她的时区太久。
我发现一些网站使用了大约 100 个时区(越来越少)。
保持一个小时区列表同时仍然覆盖整个世界确实是一个具有挑战性的问题。当然,你如何处理它完全取决于你。
您可能会考虑的一个建议是首先按国家(或地区)过滤列表。请参阅此演示,了解它在您的应用程序中的外观。
您可以使用我的TimeZoneNames库来实现这一点。特别是,该GetTimeZonesForCountry
方法非常适合。除了国家/地区之外,您还可以选择提供阈值日期以过滤掉在该日期之前不需要的历史时区。
例如,以下获取在巴西安排未来活动时所需的时区。它返回一个字典,其中键是 IANA 时区 ID,值是要显示给用户的本地化显示名称,在本例中为巴西葡萄牙语。
var zones = TZNames.GetTimeZonesForCountry("BR", "pt-BR", DateTimeOffset.UtcNow);
输出:
钥匙 | 价值 |
---|---|
America/Rio_Branco | Horário do Acre |
美洲/马瑙斯 | Horário do Amazonas (马瑙斯) |
美国/库亚巴 | Horário do Amazonas (库亚巴) |
美国/巴伊亚 | Horário de Brasília (巴伊亚) |
美国/圣保罗 | Horário de Brasília (圣保罗) |
美国/诺罗尼亚 | 霍拉里奥·德·费尔南多·德诺罗尼亚 |
有关更多示例,请参阅TimeZoneNames站点上的自述文件。
如果您想要一个列表而不是按国家/地区过滤,您可能会考虑使用不同的方法是使用 Windows 显示名称,它的列表比 IANA 短得多。TimeZoneNames 也有这些,无论您是否托管在 Windows 上都可以使用。
例如,以下内容获取巴西葡萄牙语的 Windows 显示名称及其关联的 IANA 时区 ID。
var displayNames = TZNames.GetDisplayNames("pt-BR", true);
部分输出:
钥匙 | 价值 |
---|---|
等/GMT+12 | (UTC-12:00) Linha de Data Internacional Oeste |
等/GMT+11 | (UTC-11:00) Tempo Universal Coordenado-11 |
美国/埃达克 | (UTC-10:00) 伊利亚斯阿留塔斯 |
太平洋/檀香山 | (UTC-10:00) 哈瓦伊 |
太平洋/马克萨斯 | (UTC-09:30) 伊利亚斯马克萨斯 |
美国/安克雷奇 | (UTC-09:00) 阿拉斯加 |
等/GMT+9 | (UTC-09:00) Tempo Universal Coordenado-09 |
美国/怀特霍斯 | (UTC-07:00) 育空地区 |
美国/蒂华纳 | (UTC-08:00) 下加利福尼亚州 |
等/GMT+8 | (UTC-08:00) Tempo Universal Coordenado-08 |
美国/洛杉矶 | (UTC-08:00) Hora do Pacífico (EUA e Canada) |
美国/凤凰 | (UTC-07:00) 亚利桑那州 |
美国/奇瓦瓦 | (UTC-07:00) 吉娃娃、拉巴斯、马萨特兰 |
美国/丹佛 | (UTC-07:00) Hora das Montanhas (EUA e Canada) |
美国/危地马拉 | (UTC-06:00) 美洲中部 |
美国/芝加哥 | (UTC-06:00) 霍拉中央 (EUA e Canada) |
...
您应该找到用户使用的语言,然后找到使用该语言的人口最多的时区。但是,许多软件按时间顺序列出它们,这是您应该做的,以及列出带有时区的地区。这更像是一个基于意见的问题,但这是两种主要方法(实际上第二种方法是唯一的主要方法,但第一种方法可行)。