我需要根据两个字母的ISO-3166国家/地区代码来本地化我的C#DateTime对象
https://en.wikipedia.org/wiki/ISO_3166-2
有办法吗?
我只能使用5个字符的国家/地区代表(en-US,nl-NL等等)来应用给定的文化 .
System.Globalization.CultureInfo cultureinfo =
new System.Globalization.CultureInfo("nl-NL");
DateTime dt = DateTime.Parse(date, cultureinfo);
即使是射影映射也可以(即多个国家代码映射到单个C#文化)
4 回答
来自CultureInfo(string) constructor文件;
也来自CultureInfo.TwoLetterISOLanguageName Property
没有定义
US
,但有en
(如果你真的必须使用两个字母的名字)你可以使用它 . 所有这些都在该标准中定义 .所有这两个字母的代码都是有效的,除了
iv
,这是InvariantCulture所以我们可以忽略它 . 我写了一个简单的代码来检查它 .如何创建自己的映射?我建议按照这些步骤;
在ISO-3166和ISO 639-1标准中查找不同的双字母代码 .
创建您自己的KeyValuePair<string, string>结构,其中包含ISO-3166双字母代码作为第一个,ISO 639-1双字母代码作为第二个 .
如果您的双字母ISO-3166双字母代码在此构造函数中失败,请检查它的映射双字母代码并尝试使用该双字母代码创建
CultureInfo
.CultureInfo.Name的最后一部分是国家的ISO-3166代码,所以这就是我最终的解决方案,
唯一的问题是一些国家有不止一种文化,如GB,所以你不能只用ISO-3166代码选择正确的文化,
因此
GetCultureFromTwoLetterCountryCode("GB")
将返回"cy-GB"
文化,这可能对威尔士而言不是苏格兰 .您可以忽略这些异常或创建自己的cultureinfo数据库,并为每个国家/地区仅存储一种文化 . 那将是最好的解决方案 .
如果.net支持,您应该能够使用不变文化 .
例如 . 这有效:
当你've noted, there doesn'似乎完全支持所有国家代码时,这是因为它所采用的两个字符是 Neutral Culture .
您可以通过以下方式获取所有支持的文化列表:
特别是中性的:
var culture = new CultureInfo("US");
不起作用的原因是因为美国的中性文化是EN . (具体文化是en-US
) .在转换Country Codes to Cultures时还有其他高投票答案,我不打算在这里欺骗 .
我认为你们的地区与文化混淆了吗?
RegionInfo r = new RegionInfo(“US”);
MessageBox.Show(r.DisplayName);
这将返回“美国”