.NET如何将Persian / Farsi日期字符串(Jalali日历)解析为DateTime对象?

时间:2011-04-27 22:03:35

标签: .net datetime persian farsi

我遇到了几个很棒的代码库,用于将波斯语(Jalali日历)日期转换为格里高利日期。但是,我的原始源是一个字符串,而不是DateTime对象。在.NET框架中似乎没有官方支持使用波斯语日历解析日期(如果我错了,请告诉我!)。

我的目标:

string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");

当然,有些日期可能会在一周中的几个月和几天使用单词名称,因此我希望能够支持标准格式字符串协议。

编辑:我知道典型的DateTime.Parse功能。无法使用波斯日历,因为Microsoft将其保留为不完整和/或无法修复它。如果有人能指出一些波斯语日期解析代码,我将不胜感激。如果没有,我会要求有人删除这个问题,然后自己写一下。

4 个答案:

答案 0 :(得分:11)

您始终可以使用本机System.Globalization.PersianCalendar .NET类。但这有点棘手。

考虑将此代码从Jalali Date(此处为1387/03/18)转换为Gregorian DateTime:

System.Globalization.PersianCalendar persianCal = new System.Globalization.PersianCalendar();
    DateTime GregorianDate = persianCal.ToDateTime(1387, 3, 18, 12, 0, 0, 0);

和以下代码将Gregorian DateTime(此处为1983/08/03)转换为波斯日期字符串:

DateTime GregorianDate = DateTime.Parse("1983/08/03");
string FarsiDateConverted = persianCal.GetYear(GregorianDate).ToString("0000") + "/" +
             persianCal.GetMonth(GregorianDate).ToString("00") + "/" +
             persianCal.GetDayOfMonth(GregorianDate).ToString("00");

只是@Dan Bailiff提供的链接的注释我应该重复文章作者的话:

  

“使用此JalaiCalendar代替.NET Framework的PersianCalendar的主要目的必须是历史事件的日期对话。如果您只想在网站上显示当前日期,PersianCalendar就足够了。”

实际上.NET Framework的算法在1178年到1634年Jalali(1799年至2256年Gregorian)是正确的

更新

Starting with the .NET Framework 4.6,PersianCalendar类使用Hijri 太阳天文算法而不是观察算法来计算日期。这使得PersianCalendar实施与伊朗和阿富汗使用的波斯日历一致,这两个国家的波斯日历最为广泛使用。因此,如果您使用> 4.6版本的.NET Framework,则不需要任何其他库来将日期转换为/来自波斯日历。

答案 1 :(得分:3)

为解析日期字符串,我只使用默认日历来获取日期值(年,月,日等)

然后我使用this library here将波斯日期值转换为格里高利日期值。

我的代码现在看起来像这样:

string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate, "yyyy/MM/dd", persianCulture);    // this parses the date as if it were Gregorian

JalaliCalendar jc = new JalaliCalendar();
// convert the Persian calendar date to Gregorian
DateTime gregorianDateTime = jc.ToDateTime(persianDateTime.Year, persianDateTime.Month, persianDateTime.Day, persianDateTime.Hour, persianDateTime.Minute, persianDateTime.Second, persianDateTime.Millisecond);

当然,我必须自己处理日期组件的名称(一周中的几个月,几周),但我可以很容易地处理它。

答案 2 :(得分:2)

或者:

using System.Globalization;

CultureInfo MyCultureInfo = new CultureInfo("fa-IR");
      string MyString = "1390/02/07";
      DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);

还有更多例子: http://msdn.microsoft.com/en-us/library/2h3syy57.aspx#Y418

答案 3 :(得分:0)

在ASP.NET MVC中尝试验证波斯日期

 [RegularExpression(@"^$|^([1۱][۰-۹ 0-9]{3}[/\/]([0 ۰][۱-۶ 1-6])[/\/]([0 ۰][۱-۹ 1-9]|[۱۲12][۰-۹ 0-9]|[3۳][01۰۱])|[1۱][۰-۹ 0-9]{3}[/\/]([۰0][۷-۹ 7-9]|[1۱][۰۱۲012])[/\/]([۰0][1-9 ۱-۹]|[12۱۲][0-9 ۰-۹]|(30|۳۰)))$", ErrorMessage = "Not Validate")]

有关验证波斯语日期的更多信息,请访问此链接

اعتبارسنجی تاریخ شمسی با Regular Expression