アプリケーションで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);