Как указано в комментариях к вопросу, вы не сможете получить единый часовой пояс для каждой страны. Слишком много стран с несколькими часовыми поясами.
Что вы можете сделать, так это отфильтровать список стандартных часовых поясов IANA/Olson вплоть до доступных в конкретной стране.
Один из способов сделать это на C# — использовать Noda Time:
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 берутся из дополнительных данных CLDR Unicode. . Это не становится ближе к «официальному», чем это.
person
Matt Johnson-Pint
schedule
31.10.2013