如何将 PersianCalendar 设置为 CultureInfo






4.33/5 (25投票s)
如何将 PersianCalendar 设置为 CultureInfo。
引言
DateTimeFormatInfo
的 Calendar
属性只接受与此 DateTimeFormatInfo
实例相关联的区域性有效的日历。例如,如果当前实例源自“fa-Ir
” CultureInfo
对象的 DateTimeFormatInfo
属性,则此属性只能接受对“fa-Ir
”区域性有效的日历。CultureInfo.Calendar
属性指定区域性的默认日历 (GregorianCalendar
),CultureInfo.OptionalCalendars
属性指定区域性支持的所有日历 (GregorianCalendar
和 HijriCalendar
)。
.NET Framework 不支持区域性的波斯日历。 此区域性不接受该日历;因此,在此区域性中显示 DateTime
是不可能的。
一个解决此问题的众所周知的方案是声明一个新的类型,如 PersianDate
。此类型包装 DateTime
。开发人员应该使用它,但不要使用 DateTime
及其它依赖于它的类的功能。因此,我提出了一个解决这些问题的方案。
背景
为了将日历设置为区域性,它的 OptionalCalendars
应该有一个指定的日历。在波斯区域性中,此日历不存在。此代码引发异常
//this code raises an exception
info.DateTimeFormat.Calendar = new PersianCalendar();
Using the Code
使用 PersianCultureHelper
将波斯日历设置为
//create an instance of culture
CultureInfo info = new CultureInfo(“fa-Ir”);
//set Persian option to specified culture
PersianCultureHelper.SetPersianOptions(info);
此类通过使用反射将 PersianCalendar
的实例设置为指定的区域性。它查找区域性及其 DateTimeFormatInfo
的 private
字段,并为其设置正确的值。 使用此解决方案,您不需要新的 DateTime
版本。
使用此解决方案,您可以获得两个优势
- 您可以使用
DateTime
并显示它,而不会遇到异常 - 您可以为区域性启用 .NET Framework 功能,如 ASP.NET 日历功能
您可以安装“波斯区域性 Package.msi”并编写此代码
// create an instance of culture
CultureInfo info = new CultureInfo(“fa-Ir”);
//set Persian calendar to it without get exception
info.DateTimeFormat.Calendar = new PersianCalendar();
此安装程序仅通过将 fa-IR.nlp 文件复制到 %SystemRoot%\Globalization 来启用 .NET Framework 的自定义区域性。您可以从 MSDN 获取有关创建自定义区域性的更多信息。
历史
- 2008 年 12 月 28 日:首次发布