我在应用程序中使用 NodaTime,我需要用户从下拉列表中选择他们的时区。我有以下软要求:
1) 该列表仅包含对真实地点的当前和不久的将来合理有效的选择。应过滤掉历史、晦涩和通用的时区。
2) 列表应首先按 UTC 偏移量排序,然后按时区名称排序。这有望使它们按对用户有意义的顺序排列。
我编写了以下代码,它确实有效,但并不完全符合我的要求。过滤器可能需要调整,我宁愿让偏移量代表基本(非 dst)偏移量,而不是当前偏移量。
建议?建议?
var now = Instant.FromDateTimeUtc(DateTime.UtcNow);
var tzdb = DateTimeZoneProviders.Tzdb;
var list = from id in tzdb.Ids
where id.Contains("/") && !id.StartsWith("etc", StringComparison.OrdinalIgnoreCase)
let tz = tzdb[id]
let offset = tz.GetOffsetFromUtc(now)
orderby offset, id
select new
{
Id = id,
DisplayValue = string.Format("({0}) {1}", offset.ToString("+HH:mm", null), id)
};
// ultimately we build a dropdown list, but for demo purposes you can just dump the results
foreach (var item in list)
Console.WriteLine(item.DisplayValue);