正如问题评论中所指出的,您将无法获得每个国家/地区的单个时区。拥有多个时区的国家的例子太多了。
你什么can做的是过滤标准列表IANA/奥尔森时区直至特定国家/地区可用。
在 C# 中执行此操作的一种方法是野田时间:
IEnumerable<string> zoneIds = TzdbDateTimeZoneSource.Default.ZoneLocations
.Where(x => x.CountryCode == countryCode)
.Select(x => x.ZoneId);
传递两位数的 ISO-3166 国家/地区代码,例如"AU"
对于澳大利亚。结果是:
"Australia/Lord_Howe",
"Australia/Hobart",
"Australia/Currie",
"Australia/Melbourne",
"Australia/Sydney",
"Australia/Broken_Hill",
"Australia/Brisbane",
"Australia/Lindeman",
"Australia/Adelaide",
"Australia/Darwin",
"Australia/Perth",
"Australia/Eucla"
如果出于某种原因您想要 Windows 时区标识符,您可以将其与TimeZoneInfo
对象,Noda Time 也可以映射这些:
var source = TzdbDateTimeZoneSource.Default;
IEnumerable<string> windowsZoneIds = source.ZoneLocations
.Where(x => x.CountryCode == countryCode)
.Select(tz => source.WindowsMapping.MapZones
.FirstOrDefault(x => x.TzdbIds.Contains(
source.CanonicalIdMap.First(y => y.Value == tz.ZoneId).Key)))
.Where(x => x != null)
.Select(x => x.WindowsId)
.Distinct()
再次调用"AU"
对于澳大利亚退货:
"Tasmania Standard Time",
"AUS Eastern Standard Time",
"Cen. Australia Standard Time",
"E. Australia Standard Time",
"AUS Central Standard Time",
"W. Australia Standard Time"
如果您想知道该数据的可靠性如何,国家/地区到 tzid 的映射是 IANA 时区数据库本身的一部分,位于zone.tab文件。 IANA 到 Windows 的映射数据来自Unicode CLDR 补充数据。没有比这更接近“官方”的了。