Czy istnieje poprawny konwerter dat Hidżry na daty gregoriańskie

10

Mam pracę nad wieloma projektami z konwersjami daty. na przykład pracuję nad kalendarzem słonecznym i jak przekonwertować je na daty gregoriańskie i odwrotnie. Kalendarz słoneczny (kalendarz perski) jest prawie podobny do daty gregoriańskiej pod względem liczby dni w roku [skok lub nie].
Ale ostatnio pracowałem nad projektem z kalendarzem księżycowym. Podczas badań kalendarza księżycowego zdałem sobie sprawę, że nie ma żadnej logicznej metody konwersji układu księżycowego na słoneczny (przynajmniej o ile mi wiadomo).
Oto kilka odnośników, które na nich badałem:

  1. Nie można przekonwertować z daty Hidżry na datę gregoriańską (c #)
  2. Konwertuj datę z kalendarza Hidżry na kalendarz gregoriański i odwrotnie
  3. Data Hidżry Do gregoriańskiego przy użyciu DateTime.Parse
  4. Konwertuj datę Hidżry na dane gregoriańskie

Idąc za powyższymi linkami, szkoląc i testując przedstawione algorytmy, zauważyłem, że żaden z nich nie jest absolutnie poprawny.

Wystarczy powiedzieć, wystarczy przekonwertować "1441/02/30" [Safar 30th]na datę gregoriańską, którą każdą metodę chcesz wypróbować.

Poniższy obraz jest pomocny dla wyżej wspomnianego przykładu. wprowadź opis zdjęcia tutaj

Umieściłem tutaj niektóre kody testowe i nie udało mi się:

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

Błąd powyższego kodu:

DateTime reprezentowana przez ciąg nie jest obsługiwana w kalendarzu System.Globalization.HijriCalendar.

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

Błąd powyższego kodu:

„Dzień musi wynosić od 1 do 29 dla miesiąca 2.”

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

Błąd powyższego kodu:

„Dzień musi wynosić od 1 do 29 dla miesiąca 2.”

Po tym starałem się zrozumieć, czy istnieje jakiś algorytm do wdrożenia konwersji daty Hijri na datę gregoriańską?
Testuję więc islamski internetowy konwerter dat i jestem zaskoczony!
Po prostu spróbuj wpisać "1441/2/30"oba konwertery dat.
pierwszy powraca October 30, 2019
I drugi powraca 29 October 2019
Hijri konwerter gregoriański Islamski konwerter
daty - konwerter kalendarza gregoriańskiego

Nie wiem więc, czy istnieje jakiś prawdziwy algorytm do konwersji dat Hidżry na gregoriański.
Z góry dziękuję za poświęcony czas.

Aby uzyskać więcej informacji, https://www.wikiwand.com/simple/Islamic_calendar


Aktualizacja : Wiem, że nie ma żadnej poprawnej biblioteki. ale jeśli ktoś ma wiedzę lub szczegółowe informacje na temat kalendarza Hidżry (cały jego interfejs), proszę po prostu opisz tutaj. Naprawdę chcę wdrożyć kalendarz Hidżry dla wszystkich.

Reza Paidar
źródło
czy twój przykład powinien dać wynik jako 17-październik-2019?
snr - Przywróć Monikę
Kiedy wypróbujesz swój przykład na searchtruth.com/hijri , spowoduje to niewłaściwą datę?
snr - Przywróć Monikę
Naprawdę nie wiem, jaki jest prawidłowy wynik, ze względu na dwa islamskie konwertery daty, o których wspomniałem w moim poście, wynik powinien być October 30, 2019 wedlub October 29, 2019 tue. Próbowałem teraz.
Reza Paidar
Twoja data wprowadzenia wydaje się nieprawidłowa. Jeśli dostaniesz 1441 zamiast 1442 na 30. bezpieczniejsze. Sprawdź poprawność daty.
snr - Przywróć Monikę
1
@Gus: Perski kalendarz używa układu słonecznego i został wynaleziony przez Omar khayyamperskiego matematyka. Perski kalendarz ma 365 dni (366 w roku przestępnym), ale kalendarz księżycowy jest o 11-12 dni mniejszy niż kalendarz perski.
Reza Paidar

Odpowiedzi:

1

Możesz użyć czegoś takiego jak ten kod do konwersji i parsowania ciągów kalendarza hidżry na gregoriański 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);
      }

}
Ali Hamidi
źródło
dziękuję za poświęcony czas i rozwiązanie. Ale już przetestowałem twoje rozwiązanie i generuje błąd Day must be between 1 and 29 for month 2. Parameter name: day. Jak argumentowaliśmy wcześniej w moich komentarzach do wpisu, Safar innego miesiąca Hijri (księżycowego) ma zmienną liczbę dni. twoje rozwiązanie ma ten sam błąd podobny do innych rozwiązań.
Reza Paidar
Może występować błąd w klasie HijriCalendar .Net, więc edytowałem kod i ma obejście tego wyjątku.
Ali Hamidi
Dzięki. Nie mogę powiedzieć, że w tym przypadku jest błąd z .net liberary. Zauważyłem, że istnieje więcej niż jeden interfejs to epok z kalandrem hijri bez żadnego logicznego opisu. Rozwiązaniem jest oszustwo, aby pominąć błąd, a nie do końca dokładna odpowiedź. Głosuję jednak za oddaniem czasu
Reza Paidar
Widziałem kod źródłowy klasy HijriCalendar . przed konwertowaniem dat sprawdza DaysInMonth. Zakłada 29 dni dla Safar (miesiąc 2). Ma mały błąd w tym miesiącu
Ali Hamidi
1
Jeśli sprawdzisz komentarze do mojego posta, Microsoft wprowadził dokumentację kalendarza hidżry i możesz się dowiedzieć, że Safar i drugi miesiąc ma statycznie 29 dni. Więc w pewnym sensie masz rację, to jest błąd dla tej biblioteki.
Reza Paidar