我正在一个应用程序中使用NodaTime,需要用户从下拉列表中选择他们的时区。 我有以下软件要求:
1)列表仅包含对于真实地点的现在和不久的未来合理有效的选择。 应过滤掉历史、模糊和通用时区。
2)该列表应首先按UTC偏移量排序,然后按时区名称排序。 这将有望按对用户有意义的顺序排列它们。
我编写了以下代码,它确实可以工作,但并不完全符合我的要求。 过滤器可能需要进行调整,我更希望偏移量代表基本(非夏令时)偏移量,而不是当前偏移量。
有建议吗? 推荐内容?
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);