65.9K
CodeProject 正在变化。 阅读更多。
Home

如何将 PersianCalendar 设置为 CultureInfo

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (25投票s)

2008年12月28日

LGPL3

2分钟阅读

viewsIcon

90601

downloadIcon

6059

如何将 PersianCalendar 设置为 CultureInfo。

引言

DateTimeFormatInfoCalendar 属性只接受与此 DateTimeFormatInfo 实例相关联的区域性有效的日历。例如,如果当前实例源自“fa-IrCultureInfo 对象的 DateTimeFormatInfo 属性,则此属性只能接受对“fa-Ir”区域性有效的日历。CultureInfo.Calendar 属性指定区域性的默认日历 (GregorianCalendar),CultureInfo.OptionalCalendars 属性指定区域性支持的所有日历 (GregorianCalendarHijriCalendar)。

.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 的实例设置为指定的区域性。它查找区域性及其 DateTimeFormatInfoprivate 字段,并为其设置正确的值。 使用此解决方案,您不需要新的 DateTime 版本。

使用此解决方案,您可以获得两个优势

  • 您可以使用 DateTime 并显示它,而不会遇到异常

    untitled.JPG

  • 您可以为区域性启用 .NET Framework 功能,如 ASP.NET 日历功能

    untitled1.JPG

您可以安装“波斯区域性 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 日:首次发布
© . All rights reserved.