.NET如何将波斯语/波斯语日期字符串(Jalali calendar)解析为DateTime对象?

.NET如何将波斯语/波斯语日期字符串(Jalali calendar)解析为DateTime对象?,.net,datetime,persian,farsi,.net,Datetime,Persian,Farsi,我已经运行了几个伟大的代码库,用于将波斯(贾拉里日历)日期转换为公历日期。但是,我的原始源是一个字符串,而不是DateTime对象。在.NET框架中似乎没有官方支持使用波斯日历解析日期(如果我错了,请告诉我!) 我的目标是: string persianDateString="1390/02/07"; DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd"); 当然,有些日期可能会使用几个

我已经运行了几个伟大的代码库,用于将波斯(贾拉里日历)日期转换为公历日期。但是,我的原始源是一个字符串,而不是DateTime对象。在.NET框架中似乎没有官方支持使用波斯日历解析日期(如果我错了,请告诉我!)

我的目标是:

string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");
当然,有些日期可能会使用几个月和一周中的几天的单词名,所以我希望能够支持标准格式的字符串协议

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

或者:

using System.Globalization;

CultureInfo MyCultureInfo = new CultureInfo("fa-IR");
      string MyString = "1390/02/07";
      DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
还有更多的例子:

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

然后,我使用将波斯日期值转换为公历日期值

我的代码现在如下所示:

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);

当然,我必须自己处理带有名称(月份、一周中的几天)的日期组件,但我可以非常轻松地处理这些组件。

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

考虑将Jalali日期(此处为1387/03/18)转换为公历日期时间的代码:

System.Globalization.PersianCalendar persianCal = new System.Globalization.PersianCalendar();
    DateTime GregorianDate = persianCal.ToDateTime(1387, 3, 18, 12, 0, 0, 0);
以及以下代码,用于将格里高利日期时间(此处为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)是正确的

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

在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")]

我只是清理了一个旧问题,最后在谷歌翻译和在线波斯日历转换器等在线工具的帮助下编写了自己的基本解析器。由于要翻译的单词寥寥无几,我可以硬编码月/日名称,并获得所需内容。然后,我在codeproject上找到了一个免费的库,可以让我从一个日历转换到另一个日历。从.NET Framework 4.6开始,PersianCalendar类使用Hijri太阳天文算法,因此即使在历史事件上,PersianCalendar也是可选的@mehrandvd我在答案中添加了这条注释。谢谢。正如上面提到的@comecme,这个答案是不正确的。您可以使用
newdatetime(1395,2,31,0,0,0,0,new PersianCalendar())