Esiste un convertitore corretto per le date Hijri in date gregoriane


10

Ho lavorato su molti progetti con convertitori di date. ad esempio, lavoro sul calendario solare e su come convertirli in date gregoriane e viceversa. Il calendario solare (calendario persiano) è quasi simile alla data gregoriana in termini di numero di giorni in un anno [salto o no].
Ma di recente ho lavorato a un progetto con il calendario lunare. Mentre eseguo ricerche sul calendario lunare, mi sono reso conto che non esiste un singolo metodo logico per convertire il sistema lunare in solare (almeno per quanto ne so).
Ecco alcuni link di riferimento che ho studiato su di essi:

  1. Impossibile convertire da Hijri Date a data gregoriana (c #)
  2. Convertire la data dal calendario Hijri in calendario gregoriano e viceversa
  3. Hijri Date Per gregorian usando DateTime.Parse
  4. Convertire la data di Hijri in dat gregoriano

Mentre seguivo i link sopra, la formazione e il test delle persone hanno presentato algoritmi, ho notato che nessuno di loro è assolutamente corretto.

Basti dire, basta convertire "1441/02/30" [Safar 30th]in data gregoriana che ogni metodo che si desidera provare.

L'immagine seguente è utile per l'esempio di cui sopra. inserisci qui la descrizione dell'immagine

Ho messo qui i miei codici di prova e non riesco:

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

L'errore per il codice sopra:

Il DateTime rappresentato dalla stringa non è supportato nel calendario System.Globalization.HijriCalendar.

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

L'errore per il codice sopra:

"Il giorno deve essere compreso tra 1 e 29 per il mese 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();

L'errore per il codice sopra:

"Il giorno deve essere compreso tra 1 e 29 per il mese 2."

Dopo ciò, stavo cercando di capire che esiste un algoritmo per distribuire la data di conversione di Hijri in data gregoriana?
Quindi ho testato un convertitore di date online islamico e sono rimasto sorpreso!
Prova a inserire "1441/2/30"entrambi i convertitori di data.
il primo che ritorna October 30, 2019
E il secondo che ritorna 29 October 2019
Hijri gregorian-converter
Convertitore di date islamico - Gregorian Calendar Converter

Quindi non so che esiste un vero algoritmo per convertire le date Hijri in gregoriano.
Grazie in anticipo per il tuo tempo.

Per maggiori informazioni, https://www.wikiwand.com/simple/Islamic_calendar


Aggiornamento : so che non esiste alcuna libreria corretta per sapere. ma se qualcuno ha conoscenza o dettagli sul calendario Hijri (tutta la sua interfaccia), per favore, descrivi qui che voglio davvero distribuire un calendario Hijri per tutti.


il tuo esempio dovrebbe fornire un output come 17-ottobre-2019?
snr - Ripristina Monica il

Quando provi il tuo esempio su searchtruth.com/hijri , si ottiene una data errata ??
snr - Ripristina Monica il

Non so davvero quale sia l'output corretto, a causa di due convertitori di date islamici che ho menzionato nel mio post, l'output dovrebbe essere October 30, 2019 wedo October 29, 2019 tue. Ci ho provato adesso.
Reza Paidar,

la tua data di inserimento sembra errata. Se arrivi nel 1441 invece del 1442 per il 30 ° più sicuro. Verifica la correttezza della tua data.
snr - Ripristina Monica il

1
@Gus: il calendario persiano sta usando il sistema solare e inventato dal Omar khayyammatematico persiano. Il calendario persiano ha 365 giorni (366 in un anno bisestile) ma il calendario lunare è di 11-12 giorni inferiore al calendario persiano.
Reza Paidar,

Risposte:


1

È possibile utilizzare qualcosa di simile a questo codice per convertire e analizzare le stringhe del calendario hijri in gregorian 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);
      }

}

grazie per il tuo tempo e la tua soluzione. Ma ho già testato la tua soluzione e genera un errore Day must be between 1 and 29 for month 2. Parameter name: day. Come abbiamo discusso in precedenza nei miei commenti post, The Safar di un altro mese Hijri (lunare) ha giorni variabili. la tua soluzione ha lo stesso errore simile ad altre soluzioni.
Reza Paidar,

Potrebbe esserci un bug nella classe HijriCalendar di .Net, quindi ho modificato il codice e ha una soluzione alternativa per l'eccezione.
Ali Hamidi

Grazie. Non posso dire che ci sia un bug con .net liberary in questo caso. Ho notato che ci sono più di una interfacce sono epoche con hijri calander senza alcuna descrizione logica. La tua soluzione è un trucco per saltare l'errore, non una risposta abbastanza precisa. Tuttavia ti voterò per aver concesso del tempo
Reza Paidar, il

Ho visto il codice sorgente della classe HijriCalendar . sta controllando DaysInMonth prima di convertire le date. Presume 29 giorni per Safar (mese 2). Quindi ha un piccolo bug per questo mese
Ali Hamidi

1
Se controlli i commenti sul mio post, microsoft ha introdotto la documentazione per il calendario hijri e puoi scoprire là Safar e l'altro mese ha staticamente 29 giorni. Quindi, in qualche modo hai ragione, questo è un bug per questa libreria.
Reza Paidar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.