Hijri日期到公历日期是否有正确的转换器


10

我从事许多日期转换项目。例如,我研究太阳历,以及如何将其转换为公历日期,反之亦然。就一年中的天数而言,太阳历(波斯历)与公历几乎相似[有无le]。
但是我最近在一个与阴历有关的项目上工作。在研究农历时,我意识到没有任何一种逻辑方法可以将农历系统转换为太阳系(至少据我所知)。
这是我研究过的一些参考链接:

  1. 无法将回历日期转换为公历日期(C#)
  2. 将回历日历中的日期转换为公历,反之亦然
  3. 回历日期到公历使用DateTime.Parse
  4. 转换回历日期为格里高利历

当我按照上面的链接进行培训和测试人员介绍算法时,我注意到它们都不是绝对正确的。

只需说一下,只要将"1441/02/30" [Safar 30th]您要尝试的每种方法转换为公历日期即可。

下图对于上述示例很有帮助。 在此处输入图片说明

我在这里输入了一些测试代码,但失败了:

CultureInfo arSA = new CultureInfo("ar-SA");
arSA.DateTimeFormat.Calendar = new HijriCalendar();
var dateValue = DateTime.ParseExact("1441/02/30", "yyyy/MM/dd", arSA);
return dateValue.ToString();

上面代码的错误:

日历System.Globalization.HijriCalendar不支持由字符串表示的DateTime。

HijriCalendar hc = new HijriCalendar();
DateTime date = new DateTime(1441, 2, 30, hc);
return date.ToString();

上面代码的错误:

“第二个月的日期必须在1到29之间。”

string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
int year = int.Parse(hijri.Substring(0, 4));
string rem = hijri.Remove(0, 5);
int end = rem.IndexOf('/', 0);
int month = int.Parse(rem.Substring(0, end));
rem = rem.Remove(0, end + 1);
int day = int.Parse(rem);
DateTime date = new DateTime(year, month, day, hc);
return date.ToShortDateString();

上面代码的错误:

“第二个月的日期必须在1到29之间。”

之后,我试图了解是否有任何算法可将转换回历日期部署为格里高利历日期?
所以我测试了一些伊斯兰在线日期转换器,我很惊讶!
只需尝试输入"1441/2/30"两个日期转换器。
返回的第一个和返回October 30, 2019
的第二个回29 October 2019
格里高利转换
伊斯兰日期转换器-格里高利历转换器

所以我不知道有没有真正的算法可以将Hijri日期转换为Gregorian。
在此先感谢您的时间。

有关更多信息, 请https://www.wikiwand.com/simple/Islamic_calendar


更新:我知道这里没有任何正确的库。但是,如果某人对回历日历(所有界面)有一定的了解或详细信息,请在此描述,我真的想为所有人部署回历日历。


您的示例应将输出显示为2019年10月17日吗?
snr-恢复莫妮卡

当您在searchtruth.com/hijri上尝试示例时,日期错误?
snr-恢复莫妮卡

我真的不知道正确的输出是什么,由于我在帖子中提到了两个伊斯兰日期转换器,因此输出应为October 30, 2019 wedor October 29, 2019 tue。我现在尝试了。
Reza Paidar

您输入的日期似乎有误。如果您获得1441而不是1442的安全性提高了30,检查日期的正确性。
snr-恢复莫妮卡

1
@Gus:波斯日历用于太阳系,Omar khayyam是波斯数学家发明的。波斯日历有365天(a年为366天),但农历日历比波斯日历少11-12天。
Reza Paidar

Answers:


1

您可以使用类似以下代码的方式将hijri日历字符串转换并解析为公历DateTime。

//assuming current culture is like en-us or something with gregorian calendar
string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
var dateParts = hijri.Split('/');
DateTime? gregorianDate=null;
if (dateParts.Length == 3 && int.TryParse(dateParts[0], out int year) &&
     int.TryParse(dateParts[1], out int month) && int.TryParse(dateParts[2], out int day))
{
      if(month == 2 && day==30)
      {
         var temp = hc.ToDateTime(year, month, 29, 0, 0, 0, 0);
         gregorianDate = temp.AddDays(1);
      }
      else
      {
         gregorianDate = hc.ToDateTime(year, month, day, 0, 0, 0, 0);
      }

}

感谢您的宝贵时间和解决方案。但是我已经测试了您的解决方案,并且抛出错误Day must be between 1 and 29 for month 2. Parameter name: day。正如我们之前在我的帖子评论中所述,另一个回历(农历)月的“萨法尔”(Safar)具有可变的天数。您的解决方案与其他解决方案具有相同的错误。
Reza Paidar

.Net 的HijriCalendar类中可能存在一个错误,因此我编辑了代码,它具有针对异常的解决方法。
Ali Hamidi

谢谢。在这种情况下,我不能说.net库存在错误。我注意到有不止一个接口是带有hijri calander的Epoch,没有任何逻辑描述。您的解决方案是逃避错误的作弊手段,而不是完全准确的答案。但是,我会投赞成票给您
雷扎·佩达

我已经看到了HijriCalendar类的源代码。它在转换日期之前检查DaysInMonth。假设Safar(第2个月)为29天。因此,本月有一个小错误
Ali Hamidi

1
如果您查看我的帖子中的评论,Microsoft会介绍hijri日历的文档,您可以在那里找到Safar和其他月份的静态29天。所以从某种意义上来说,这是该库的错误。
Reza Paidar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.