C#应用如何基于TimeZoneId获取对应CultureInfo及2位ISO名称
实现方案
前置说明
- 时区与国家/地区不是严格一一对应关系,单个时区可能覆盖多个国家,需要结合业务场景确认对应规则,以下示例默认取时区最常用的关联国家
CultureInfo.TwoLetterISOLanguageName返回的是语言代码(如en代表英语),你需要的国家2位ISO代码需要从RegionInfo类中获取- Windows系统默认使用Windows时区ID格式,Linux/macOS使用IANA时区ID格式,如果你需要跨平台运行,可以通过
TimeZoneInfo.TryConvertIanaIdToWindowsId和TimeZoneInfo.TryConvertWindowsIdToIanaId方法做两种格式的转换
示例代码
首先引用需要的命名空间:
using System.Globalization; using System.Collections.Generic;
核心逻辑实现:
// 构建时区ID到区域文化名称的映射,可根据你的业务需要补充所有用到的时区 private static readonly IReadOnlyDictionary<string, string> TimeZoneToCultureMap = new Dictionary<string, string> { {"Bangladesh Standard Time", "bn-BD" }, // 孟加拉 {"Eastern Standard Time", "en-US" }, // 美国东部 {"GMT Standard Time", "en-GB" }, // 英国 // 补充其他你需要的时区映射 }; public static (RegionInfo region, CultureInfo culture)? GetInfoFromTimeZoneId(string timeZoneId) { // 校验时区是否合法 if (!TimeZoneInfo.TryFindSystemTimeZoneById(timeZoneId, out _)) { return null; } // 查找时区对应的文化名称 if (!TimeZoneToCultureMap.TryGetValue(timeZoneId, out var cultureName)) { return null; } try { var culture = CultureInfo.GetCultureInfo(cultureName); var region = new RegionInfo(culture.Name); return (region, culture); } catch (CultureNotFoundException) { return null; } }
调用示例
// 从数据库取出的用户时区ID var userTimeZoneId = "Bangladesh Standard Time"; var info = GetInfoFromTimeZoneId(userTimeZoneId); if (info.HasValue) { var (region, culture) = info.Value; Console.WriteLine("区域信息:"); Console.WriteLine("* 文化名称: {0}", culture.Name); Console.WriteLine("* 文化显示名称: {0}", culture.DisplayName); Console.WriteLine("* 2位国家ISO代码: {0}", region.TwoLetterISORegionName); // 输出BD Console.WriteLine("* 2位语言ISO代码: {0}", culture.TwoLetterISOLanguageName); // 输出bn }
如果你的业务覆盖时区很多,不想手动维护映射,可以引入NodaTime等时间处理库,内置了时区和国家的关联查询能力,不需要手动维护映射表。
内容的提问来源于stack exchange,提问作者mnu-nasir
相关产品推荐
相关产品推荐

