.NET如何将波斯语 / Farsi Date String(Jalali Calendar)解析到DateTime对象中?
题
我已经跨过几个出色的代码库,用于将波斯语(Jalali日历)日期转换为Gregorian日期。但是,我的原始来源是字符串,而不是DateTime对象。 .NET框架中似乎没有官方支持使用波斯日历来解析日期(如果我错了,请告诉我!)。
我的目标:
string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");
当然,某些日期可能会在一周的几个月和几天内使用单词名称,因此我希望能够支持标准格式字符串协议。
编辑:我知道典型的datetime.parse功能。波斯日历不能使用,因为微软使其不完整和/或不会修复它。如果有人可以指出一些波斯日期解析代码,我将不胜感激。如果没有,我会要求某人删除问题,然后自己写。
解决方案 2
对于解析日期字符串,我只使用默认日历来获取日期值(年,月,日等)
然后我使用 这个库在这里 将波斯日期值转换为Gregorian日期值。
我的代码现在看起来像这样:
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)转换为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框架的Persiancalendar的主要目的必须是历史事件的日期对话。如果您只想在网站上显示当前日期,Persiancalendar就足够了。”
实际上,.NET框架的算法是正确的1178年至1634年的Jalali(1799年至2256年Gregorian)
更新:
从.NET框架4.6开始, ,Persiancalendar类使用Hijri 太阳天文算法 而不是计算日期的观察算法。这使得波斯卡伦达的实施与伊朗和阿富汗使用的波斯日历一致,这是波斯日历在大多数广泛使用中的两个国家。因此,如果您使用> 4.6版本的.NET框架,则不需要任何其他库来转换到波斯日历的日期。
或者:
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
在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")]
有关验证波斯日期的更多信息,请访问此链接