我在应用程序中使用NodaTime,我需要用户从下拉列表中select他们的时区。 我有以下软要求: 1)名单只包含真实场所的现在和将来合理有效的select。 应该过滤掉历史的,模糊的和通用的时区。 2)该列表应先按UTC偏移量sorting,然后按时区名称sorting。 这有希望使他们对用户有意义的顺序。 我已经写了下面的代码,这确实有效,但并不完全是我所追求的。 filter可能需要调整,我宁愿让偏移量代表基础(非dst)的偏移量,而不是当前的偏移量。 build议? build议? 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) }; […]
如时区标记wiki中所述 ,有两种不同的时区样式。 由Microsoft提供的用于Windows和.Net TimeZoneInfo类的值由诸如Eastern Standard Time类的值标识。 IANA在TZDB中提供的数据通过诸如America/New_York的值来确定。 许多基于互联网的API使用IANA时区,但出于多种原因,可能需要将其转换为Windows时区ID,反之亦然。 这怎么能在.Net中完成呢?