我遇到了几个很棒的代码库,用于将波斯语(Jalali日历)日期转换为格里高利日期。但是,我的原始源是一个字符串,而不是DateTime对象。在.NET框架中似乎没有官方支持使用波斯语日历解析日期(如果我错了,请告诉我!)。
我的目标:
string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");
当然,有些日期可能会在一周中的几个月和几天使用单词名称,因此我希望能够支持标准格式字符串协议。
编辑:我知道典型的DateTime.Parse功能。无法使用波斯日历,因为Microsoft将其保留为不完整和/或无法修复它。如果有人能指出一些波斯语日期解析代码,我将不胜感激。如果没有,我会要求有人删除这个问题,然后自己写一下。
答案 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")]
有关验证波斯语日期的更多信息,请访问此链接