新 CultureInfo(string Name) 构造函数 - .NET (C#)

Posted

技术标签:

【中文标题】新 CultureInfo(string Name) 构造函数 - .NET (C#)【英文标题】:new CultureInfo(string Name) constructor - .NET (C#) 【发布时间】:2010-11-07 15:38:42 【问题描述】:

我有一种情况,我将日期/数字等的字符串表示形式保存在数据库中,并且由于应用程序在多个国家/地区运行,有时不同国家/地区的用户使用相同的数据库,因此我将 CurrentCulture.Name 存储在带有记录的数据库,以便在客户端转换时,它使用正确的文化信息进行转换。例如:

DateTime dt = Convert.ToDateTime(value, new CultureInfo(value.ClientCulture));

这很好用,我的问题是,在调用 new CultureInfo(value.ClientCulture) 时,是从 .NET Framework 还是从 Windows 获取 CultureInfo?我担心如果从 Windows 调用,如果没有安装这些语言,可能会出现问题。如果从 .NET Framework 本身调用,那么我看不出任何问题。

谢谢

【问题讨论】:

【参考方案1】:

从MSDN 判断,我假设构造函数将抛出 ArgumentException,因为机器上不存在文化。

从CultureInfo class 的快速阅读来看,CultureInfo 对象似乎被序列化为仅一个 Name 和 UseUserOverride,这意味着任何关于文化的真实信息都存储在 Windows 中,并且依赖于正确的 Name。

【讨论】:

【参考方案2】:

“我将 CurrentCulture.Name 与记录一起存储在数据库中,以便在客户端进行转换时”

我认为你不应该用日期存储文化信息

如果您想记住用户显示日期的首选方式,您可以考虑这样做,

但是在大​​多数情况下,日期的格式(显示方式)取决于 用户的区域设置。 (用户必须能够更改它们);

只要看看用户的区域设置是什么就可以了。

回答你的问题:

从 CultureInfo.CurrentCulture 属性返回的 CultureInfo 实例基于用户在 Windows® 区域选项中选择的区域设置(如图 1 所示)。在 Windows XP 和 Windows Server™ 2003 中,这称为程序员的“用户区域设置”,以及标准和格式的“语言”。

您不必担心已安装的语言,因为始终安装用户使用的语言! (同上选定的区域设置)

见http://msdn.microsoft.com/en-us/magazine/cc163824.aspx

【讨论】:

【参考方案3】:

正确答案是:不要在db中存储用户特定的日期时间字符串!

现在每个 db 都有 datetime 类型,因此您必须使用当前用户区域设置将字符串转换为 datetime 值并将此值放入 db(而不是字符串)中。

如果在某些奇怪的情况下,db 不支持 datetime 类型,或者可能有其他一些要求(但我什至无法发明一个),那么您必须将日期时间转换为不变的 datetime 字符串,并将此字符串放入 db .

顺便说一句,为了加快速度,您应该使用 GetCultureInfo 方法而不是创建新的 CultureInfo 实例:

DateTime dt = Convert.ToDateTime(value, CultureInfo.GetCultureInfo(value.ClientCulture));

【讨论】:

我有兴趣了解更多关于使用 GetCultureInfo() 而不是创建 new CultureInfo 实例的性能优势。你能解释一下吗?

以上是关于新 CultureInfo(string Name) 构造函数 - .NET (C#)的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 在 String 或 Char 上使用 ToString() 时,在啥情况下需要提供 CultureInfo IFormatProvider?

property.GetValue 忽略 CultureInfo

CultureInfo.CreateSpecificCulture() 和类的构造函数之间的区别?

为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?

CultureInfo 的实例(来自相同的文化)基于操作系统而改变

在 WPF 绑定中使用“真实”CultureInfo.CurrentCulture,而不是 IetfLanguageTag 中的 CultureInfo