Existe-t-il un convertisseur correct pour les dates Hijri en dates grégoriennes


10

J'ai travaillé sur de nombreux projets avec des convertisseurs de date. par exemple, je travaille sur le calendrier solaire et comment les convertir en dates grégoriennes et vice versa. Le calendrier solaire (calendrier persan) est presque similaire à la date grégorienne en termes de nombre de jours dans une année [saut ou non].
Mais j'ai récemment travaillé sur un projet avec le calendrier lunaire. En faisant des recherches sur le calendrier lunaire, j'ai réalisé qu'il n'y avait pas de méthode logique unique pour convertir le système lunaire en solaire (du moins pour autant que je sache).
Voici quelques liens de références que j'ai recherchés sur eux:

  1. Impossible de convertir la date hégirienne en date grégorienne (c #)
  2. Convertir la date du calendrier Hijri en calendrier grégorien et vice versa
  3. Hijri Date To grégorien utilisant DateTime.Parse
  4. Convertir la date de Hijri en dat grégorien

En suivant les liens ci-dessus, en formant et en testant des algorithmes présentés par des personnes, j'ai remarqué qu'aucun d'entre eux n'est absolument correct.

Qu'il suffise de dire, il suffit de convertir "1441/02/30" [Safar 30th]en date grégorienne chaque méthode que vous souhaitez essayer.

L'image suivante est utile pour l'exemple susmentionné. entrez la description de l'image ici

J'ai mis ici mes quelques codes de test et échoue:

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'erreur pour le code ci-dessus:

Le DateTime représenté par la chaîne n'est pas pris en charge dans le calendrier System.Globalization.HijriCalendar.

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

L'erreur pour le code ci-dessus:

"Le jour doit être compris entre 1 et 29 pour le mois 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'erreur pour le code ci-dessus:

"Le jour doit être compris entre 1 et 29 pour le mois 2."

Après cela, j'essayais de comprendre qu'il existe un algorithme pour déployer la date de conversion Hijri en date grégorienne?
J'ai donc testé un convertisseur de date en ligne islamique et j'ai été surpris!
Essayez simplement d'entrer "1441/2/30"sur les deux convertisseurs de date.
le premier retourne October 30, 2019
et le second retourne 29 October 2019
Hijri gregorian-converter
Islamic Date Converter - Grégorien Calendar Converter

Je ne sais donc pas s'il existe un véritable algorithme pour convertir les dates Hijri en grégorien.
Merci d'avance pour votre temps.

Pour plus d'informations, https://www.wikiwand.com/simple/Islamic_calendar


Mise à jour : je sais qu'il n'y a pas de bibliothèque correcte pour savoir. mais si quelqu'un a des connaissances ou des détails sur le calendrier Hijri (toute son interface), veuillez simplement décrire ici que je veux vraiment déployer un calendrier Hijri pour tous.


votre exemple devrait-il indiquer la sortie au 17 octobre 2019?
snr - Rétablir Monica le

Lorsque vous essayez votre exemple sur searchtruth.com/hijri , cela se traduit par une mauvaise date ??
snr - Rétablir Monica le

Je ne sais vraiment pas quelle est la sortie correcte, en raison de deux convertisseurs de date islamiques que j'ai mentionnés dans mon article, la sortie devrait être October 30, 2019 wedou October 29, 2019 tue. J'ai essayé maintenant.
Reza Paidar

votre date de saisie semble incorrecte. Si vous entrez en 1441 au lieu de 1442 pour le 30ème plus sûr. Vérifiez l'exactitude de votre date.
snr - Rétablir Monica le

1
@Gus: Le calendrier persan utilise le système solaire et a été inventé par Omar khayyamle mathématicien persan. Le calendrier persan a 365 jours (366 dans une année bissextile) mais le calendrier lunaire est 11-12 jours de moins que le calendrier persan.
Reza Paidar

Réponses:


1

Vous pouvez utiliser quelque chose comme ce code pour convertir et analyser les chaînes de calendrier hijri en 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);
      }

}

merci pour votre temps et votre solution. Mais j'ai déjà testé votre solution et cela génère une erreur Day must be between 1 and 29 for month 2. Parameter name: day. Comme nous l'avons déjà expliqué dans mes commentaires, La Safar d'un autre mois Hijri (lunaire) a un nombre de jours variable. votre solution a la même erreur similaire aux autres solutions.
Reza Paidar

Il se peut qu'il y ait un bogue dans la classe HijriCalendar de .Net, j'ai donc modifié le code et il existe une solution de contournement pour l'exception.
Ali Hamidi

Merci. Je ne peux pas dire qu'il y a un bogue avec .net liberary dans ce cas. J'ai remarqué qu'il y a plus d'une interface qui sont des époques avec une calandre hijri sans aucune description logique. Votre solution est une triche pour éviter l'erreur, pas une réponse tout à fait et précise. Cependant, je voterai pour donner du temps
Reza Paidar

J'ai vu le code source de la classe HijriCalendar . il vérifie DaysInMonth avant de convertir les dates. Il suppose 29 jours pour Safar (mois 2). Il a donc un petit bug pour ce mois-ci
Ali Hamidi

1
Si vous vérifiez les commentaires sur mon post, Microsoft a introduit la documentation pour le calendrier hijri et vous pouvez découvrir que Safar et les autres mois ont statiquement 29 jours. Donc, d'une certaine façon, vous avez raison, c'est un bogue pour cette bibliothèque.
Reza Paidar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.