【问题标题】:.NET How to parse a Persian / Farsi date string (Jalali calendar) into a DateTime object?.NET 如何将波斯语/波斯语日期字符串(Jalali 日历)解析为 DateTime 对象?
【发布时间】:2011-04-27 22:03:35
【问题描述】:

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

我的目标:

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

当然,有些日期可能会使用单词名称来表示月份和星期几,所以我希望能够支持标准格式字符串协议。

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

【问题讨论】:

  • 刚刚清理了一个旧的 Q。我最终在谷歌翻译和在线波斯日历转换器等在线工具的帮助下编写了自己的基本解析器。由于只有几个单词要翻译,我可以硬编码月/日名称并得到我需要的东西。然后我在 codeproject 上找到了一个免费库,可以让我从一个日历转换到另一个日历。

标签: .net datetime persian farsi


【解决方案1】:

您始终可以使用本机 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 公历)是正确的

更新:

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

【讨论】:

  • 从 .NET Framework 4.6 开始,PersianCalendar 类使用回历太阳天文算法,因此即使在历史事件中,PersianCalendar 也是选项。 msdn.microsoft.com/en-us/library/…
  • @mehrandvd 我将此注释添加到答案中。谢谢。
【解决方案2】:

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

然后我使用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);

当然,我必须自己处理带有名称(月份、星期几)的日期组件,但我可以很容易地处理。

【讨论】:

  • 正如上面提到的@comecme,这个答案是不正确的。你可以使用new DateTime(1395, 2, 31, 0, 0, 0, 0, new PersianCalendar())
【解决方案3】:

或者:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2023-03-30
      • 2022-12-21
      • 1970-01-01
      相关资源
      最近更新 更多