Gibt es einen korrekten Konverter für Hijri-Daten zu Gregorianischen Daten?


10

Ich habe an vielen Projekten mit Datumskonvertierungen gearbeitet. Ich arbeite zum Beispiel am Sonnenkalender und wie man sie in gregorianische Daten umwandelt und umgekehrt. Der Sonnenkalender (persischer Kalender) ähnelt dem gregorianischen Datum in Bezug auf die Anzahl der Tage pro Jahr fast [Sprung oder nicht].
Aber ich habe kürzlich an einem Projekt mit dem Mondkalender gearbeitet. Als ich über den Mondkalender recherchierte, stellte ich fest, dass es keine einzige logische Methode gibt, um das Mondsystem in Solar umzuwandeln (zumindest soweit ich weiß).
Hier sind einige Referenzlinks, die ich auf ihnen recherchiert habe:

  1. Konvertiert nicht vom Hijri-Datum zum Gregorianischen Datum (c #)
  2. Konvertieren Sie das Datum vom Hijri-Kalender in den Gregorianischen Kalender und umgekehrt
  3. Hijri Date Mit DateTime.Parse nach Gregorian
  4. Konvertieren Sie das Hijri-Datum in gregorianische Daten

Als ich den obigen Links folgte, trainierte und testete ich Algorithmen, stellte ich fest, dass keiner von ihnen absolut korrekt ist.

Es genügt zu sagen, konvertieren Sie einfach "1441/02/30" [Safar 30th]in gregorianisches Datum, welche Methode Sie ausprobieren möchten.

Das folgende Bild ist für das oben genannte Beispiel hilfreich. Geben Sie hier die Bildbeschreibung ein

Ich habe hier einige Testcodes eingegeben und versage:

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

Der Fehler für den obigen Code:

Die durch die Zeichenfolge dargestellte DateTime wird im Kalender System.Globalization.HijriCalendar nicht unterstützt.

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

Der Fehler für den obigen Code:

"Tag muss für Monat 2 zwischen 1 und 29 liegen."

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

Der Fehler für den obigen Code:

"Tag muss für Monat 2 zwischen 1 und 29 liegen."

Danach habe ich versucht zu verstehen, dass es einen Algorithmus zum Bereitstellen des konvertierten Hijri-Datums zum Gregorianischen Datum gibt.
Also habe ich einen islamischen Online-Datumskonverter getestet und war überrascht!
Versuchen Sie einfach, "1441/2/30"beide Datumskonverter einzugeben .
der erste kehrt zurück October 30, 2019
Und der zweite kehrt zurück 29 October 2019
Hijri gregorian-converter
Islamic Date Converter - Gregorian Calendar Converter

Ich weiß also nicht, ob es einen echten Algorithmus gibt, um Hijri-Daten in Gregorianisch umzuwandeln.
Vielen Dank im Voraus für Ihre Zeit.

Weitere Informationen finden Sie unter https://www.wikiwand.com/simple/Islamic_calendar


Update : Ich weiß, dass es keine richtige Bibliothek gibt. Aber wenn jemand Kenntnisse oder Details über den Hijri-Kalender (seine gesamte Benutzeroberfläche) hat, beschreiben Sie bitte hier, dass ich wirklich einen Hijri-Kalender für alle bereitstellen möchte.


Sollte Ihr Beispiel die Ausgabe als 17. Oktober 2019 liefern?
snr - Monica

Wenn Sie Ihr Beispiel auf searchtruth.com/hijri ausprobieren , führt dies zu einem falschen Datum?
snr - Monica

Ich weiß wirklich nicht, was die richtige Ausgabe ist, da zwei islamische Datumskonverter, die ich in meinem Beitrag erwähnt habe, die Ausgabe sein sollten October 30, 2019 wedoder October 29, 2019 tue. Ich habe es jetzt versucht.
Reza Paidar

Ihr Eingabedatum scheint falsch zu sein. Wenn Sie in 1441 statt 1442 für 30. sicherer bekommen. Überprüfen Sie die Richtigkeit Ihres Datums.
snr - Monica

1
@Gus: Der persische Kalender nutzt das Sonnensystem und wurde vom Omar khayyampersischen Mathematiker erfunden . Der persische Kalender hat 365 Tage (366 in einem Schaltjahr), aber der Mondkalender ist 11-12 Tage kürzer als der persische Kalender.
Reza Paidar

Antworten:


1

Sie können so etwas wie diesen Code verwenden, um Hijri-Kalenderzeichenfolgen in gregorian DateTime zu konvertieren und zu analysieren.

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

}

Vielen Dank für Ihre Zeit und Ihre Lösung. Aber ich teste Ihre Lösung bereits und es wird ein Fehler ausgegeben Day must be between 1 and 29 for month 2. Parameter name: day. Wie wir bereits in meinen Post-Kommentaren dargelegt haben, hat der Safar eines anderen Hijri-Monats (Mondmonats) eine variable Anzahl von Tagen. Ihre Lösung hat den gleichen Fehler wie andere Lösungen.
Reza Paidar

Möglicherweise gibt es einen Fehler in der HijriCalendar- Klasse von .Net, daher habe ich den Code bearbeitet und es gibt eine Problemumgehung für die Ausnahme.
Ali Hamidi

Vielen Dank. Ich kann nicht sagen, dass es in diesem Fall einen Fehler mit .net liberary gibt. Mir ist aufgefallen, dass es mehr als eine Schnittstelle gibt, die Epochen mit Hijri-Kalender ohne logische Beschreibung sind. Ihre Lösung ist ein Cheat, um Fehler zu überspringen, keine ganz und genaue Antwort. Ich werde dich jedoch dafür stimmen, Zeit zu geben
Reza Paidar

Ich habe den Quellcode der HijriCalendar- Klasse gesehen. Es überprüft DaysInMonth, bevor die Daten konvertiert werden. Für Safar (Monat 2) werden 29 Tage angenommen . Es hat also einen kleinen Fehler für diesen Monat
Ali Hamidi

1
Wenn Sie nach Kommentaren zu meinem Beitrag suchen, hat Microsoft die Dokumentation für den Hijri-Kalender eingeführt und Sie können herausfinden, dass Safar und der andere Monat statisch 29 Tage haben. In gewisser Weise haben Sie Recht, dies ist ein Fehler für diese Bibliothek.
Reza Paidar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.