获取国家/地区的默认时区(通过CultureInfo)

Dav*_*len 15 c# country timezone

是否有程序或表格为每个国家/地区提供默认时区?

是的,美国,加拿大和俄罗斯有多个时区.(我认为每个其他国家只有一个.)但如果一个国家知道而不是仅仅提供从格林尼治标准时间开始的名单,那么最好开始.

最好是在C#中,但我会把它带入任何东西并转换为C#.

Mat*_*int 21

正如问题评论中所指出的那样,您无法为每个国家/地区获得单个时区.有多个时区的国家太多.

可以做的是将标准IANA/Olson时区列表过滤到特定国家/地区的可用时间列表.

在C#中执行此操作的一种方法是使用Noda Time:

IEnumerable<string> zoneIds = TzdbDateTimeZoneSource.Default.ZoneLocations
    .Where(x => x.CountryCode == countryCode)
    .Select(x => x.ZoneId);
Run Code Online (Sandbox Code Playgroud)

传递两位数的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"
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你喜欢可以与TimeZoneInfo对象一起使用的Windows时区标识符,那么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()
Run Code Online (Sandbox Code Playgroud)

再次呼吁"AU"澳大利亚回归:

"Tasmania Standard Time",
"AUS Eastern Standard Time",
"Cen. Australia Standard Time",
"E. Australia Standard Time",
"AUS Central Standard Time",
"W. Australia Standard Time"
Run Code Online (Sandbox Code Playgroud)

如果您想知道这些数据的可靠性,那么tzid映射的国家/地区是IANA时区数据库本身的一部分,位于zone.tab文件中.IANA到Windows映射数据来自Unicode CLDR补充数据.它没有比那更接近"官方".