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

14

我发现了几个很棒的代码库,可以将波斯 (Jalali) 日历日期转换为公历日期。但是我的原始数据是一个字符串,而不是 DateTime 对象。在 .NET 框架中似乎没有官方支持使用波斯日历解析日期(如果我错了,请指出来!)。

我的目标:

string persianDateString="1390/02/07";
DateTime persianDateTime = MyPersianParser.Parse(persianDateString, "yyyy/mm/dd");
当然,有些日期可能使用月份和星期几的单词名称,因此我希望能够支持标准的格式化字符串协议。
编辑:我知道通常的DateTime.Parse功能。波斯语日历无法使用,因为Microsoft将其留下不完整和/或不修复。如果有人可以向我指出一些波斯语日期解析代码,我会非常感激。如果没有,我会请求有人删除该问题并自己编写代码。

只是清理一下旧的问题。最终我自己编写了一个基本解析器,借助于在线工具如Google翻译和在线波斯日历转换器。由于只有少数单词需要翻译,我可以硬编码月份/日期名称并得到我所需的内容。然后我在codeproject上找到了一个免费的库,让我能够将一个日历转换为另一个日历。 - Dan Bailiff
4个回答

16

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

考虑以下代码,将Jalali日期(此处为1387/03/18)转换为公历DateTime:

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

提供的链接中,我想强调一下文章作者的话:

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

事实上,.NET Framework的算法适用于1178年至1634年的Jalali日历(1799年至2256年的公历)。

更新:

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


1
从.NET Framework 4.6开始,PersianCalendar类使用Hijri太阳天文算法,因此即使在历史事件中,PersianCalendar也是一个不错的选择。 https://msdn.microsoft.com/zh-cn/library/system.globalization.persiancalendar(v=vs.110).aspx - mehrandvd
@mehrandvd 我添加了这个注释到答案中。谢谢。 - Arash Milani

4

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

然后我使用这个库将波斯日期值转换为公历日期值。

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

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

当然,我需要自己处理带有名称的日期组件(例如月份和星期几),但我可以轻松处理。

正如@comecme上面提到的,这个答案是不正确的。 你可以使用 new DateTime(1395, 2, 31, 0, 0, 0, 0, new PersianCalendar()) - Arman

3

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接