问题描述
我有一个应用程序可以帮助用户预订会议(活动)。我必须让用户有机会选择他/她自己的时区,以便准确地计划和更改活动日期以及显示他/她的日程安排。我找到了包含近 400 个时区的 IANA 列表。我应该使用什么时区来覆盖尽可能多的用户。按照我的想法,用户不必太长时间寻找他/她的时区。
我发现一些网站使用了大约 100 个时区(越来越少)。
解决方法
您应该找到用户使用的语言,然后找到使用该语言的人口最多的时区。但是,许多软件按时间顺序列出它们,这是您应该做的,以及列出带有时区的地区。这更像是一个基于意见的问题,但这是两种主要方式(好吧,实际上第二种是唯一的主要方式,但第一种可行)。
,保持时区列表很小,同时仍然覆盖整个世界确实是一个具有挑战性的问题。当然,您如何处理它完全取决于您。
您可能会考虑的一个建议是首先按国家(或地区)过滤列表。请参阅 this demo,了解它在您的应用程序中的外观。
您可以使用我的 TimeZoneNames 库来实现这一点。特别是,GetTimeZonesForCountry
方法非常适合。除了国家/地区之外,您还可以选择提供阈值日期以过滤掉在该日期之前不需要的历史时区。
例如,以下内容获取在巴西安排未来活动时所需的时区。它返回一个字典,其中键是 IANA 时区 ID,值是显示给用户的本地化显示名称,在本例中为巴西葡萄牙语。
var zones = TZNames.GetTimeZonesForCountry("BR","pt-BR",DateTimeOffset.UtcNow);
输出:
键 | 价值 |
---|---|
美国/Rio_Branco | Horário do Acre |
美国/马瑙斯 | Horário do Amazonas(马瑙斯) |
美国/库亚巴 | Horário do Amazonas(库亚巴) |
美国/巴伊亚 | Horário de Brasília(巴伊亚) |
美国/圣保罗 | Horário de Brasília(圣保罗) |
美国/诺罗尼亚 | Horário de Fernando de Noronha |
有关更多示例,请参阅 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) Ilhas Marquesas |
美国/安克雷奇 | (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 Canadá) |
美国/凤凰城 | (UTC-07:00) 亚利桑那 |
美国/吉娃娃 | (UTC-07:00) 奇瓦瓦州、拉巴斯、马萨特兰 |
美国/丹佛 | (UTC-07:00) Hora das Montanhas (EUA e Canadá) |
美国/危地马拉 | (UTC-06:00) 美洲中部 |
美国/芝加哥 | (UTC-06:00) Hora Central (EUA e Canadá) |
...