¿Hay algún convertidor correcto para las fechas Hijri en fechas gregorianas?

10

Tengo trabajo en muchos proyectos con conversiones de fechas. por ejemplo, trabajo en el calendario solar y cómo convertirlos a fechas gregorianas y viceversa. El calendario solar (calendario persa) es casi similar a la fecha gregoriana en términos de la cantidad de días en un año [salto o no].
Pero recientemente trabajé en un proyecto con el calendario lunar. A medida que investigo sobre el calendario lunar, me di cuenta de que no hay ningún método lógico único para convertir el sistema lunar a solar (al menos hasta donde yo sé).
Aquí hay algunos enlaces de referencias que investigué sobre ellos:

  1. No se puede convertir de la fecha Hijri a la fecha gregoriana (c #)
  2. Convertir la fecha del calendario Hijri al calendario gregoriano y viceversa
  3. Hijri Date To gregorian usando DateTime.Parse
  4. Convertir fecha Hijri a dat gregoriano

Cuando seguí los enlaces anteriores, la capacitación y las pruebas de las personas presentaron algoritmos, noté que ninguno de ellos es absolutamente correcto.

Baste decir, solo convierta "1441/02/30" [Safar 30th]a la fecha gregoriana en cada método que desee probar.

La siguiente imagen es útil para el ejemplo mencionado anteriormente. ingrese la descripción de la imagen aquí

Puse aquí algunos códigos de prueba y falla:

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

El error para el código anterior:

El DateTime representado por la cadena no se admite en el calendario System.Globalization.HijriCalendar.

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

El error para el código anterior:

"El día debe ser entre 1 y 29 para el mes 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();

El error para el código anterior:

"El día debe ser entre 1 y 29 para el mes 2".

Después de eso, estaba tratando de entender que ¿hay algún algoritmo para implementar la fecha de conversión de Hijri a la fecha gregoriana?
¡Así que probé un conversor de fechas islámico en línea y me sorprendió!
Solo intente ingresar "1441/2/30"en ambos convertidores de fecha.
el primero regresa October 30, 2019
y el segundo regresa 29 October 2019
Hijri gregorian-converter convertidor de
fecha islámico - Gregorian Calendar Converter

Así que no sé si hay algún algoritmo real para convertir las fechas de Hijri a gregoriano.
Gracias de antemano por tu tiempo.

Para obtener más información, https://www.wikiwand.com/simple/Islamic_calendar


Actualización : Sé que no hay ninguna biblioteca correcta para saber. pero si alguien tiene conocimiento o detalles sobre el Calendario Hijri (toda su interfaz), simplemente describa aquí. Realmente quiero implementar un calendario Hijri para todos.

Reza Paidar
fuente
¿Debería su ejemplo dar salida como 17-octubre-2019?
snr - Restablece a Monica el
Cuando prueba su ejemplo en searchtruth.com/hijri , ¿da como resultado una fecha incorrecta?
snr - Restablece a Monica el
Realmente no sé cuál es la salida correcta, debido a los dos convertidores de fecha islámicos que mencioné en mi publicación, la salida debería ser October 30, 2019 wedo October 29, 2019 tue. Lo intenté ahora.
Reza Paidar
Su fecha de entrada parece incorrecta. Si llegas a 1441 en lugar de 1442 por 30º más seguro. Verifique la corrección de su fecha.
snr - Restablece a Monica el
1
@Gus: el calendario persa está utilizando el sistema solar e inventado por Omar khayyamel matemático persa. El calendario persa tiene 365 días (366 en un año bisiesto), pero el calendario lunar es 11-12 días menor que el calendario persa.
Reza Paidar

Respuestas:

1

Puede usar algo como este código para convertir y analizar cadenas de calendario hijri a gregoriano 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
fuente
Gracias por su tiempo y su solución. Pero ya pruebo su solución y arroja un error Day must be between 1 and 29 for month 2. Parameter name: day. Como discutimos antes en los comentarios de mi publicación, El Safar de otro mes Hijri (lunar) tiene un recuento de días variables. su solución tiene el mismo error similar a otras soluciones.
Reza Paidar
Puede haber un error en la clase HijriCalendar de .Net, así que edité el código y tiene una solución para la excepción.
Ali Hamidi
Gracias. No puedo decir que haya un error con .net liberary en este caso. Noté que hay más de una interfaz que son épocas con hijri calander sin ninguna descripción lógica. Su solución es un truco para omitir errores, no una respuesta precisa y precisa. Sin embargo, te votaré por dar tiempo
Reza Paidar
He visto el código fuente de la clase HijriCalendar . está comprobando DaysInMonth antes de convertir las fechas. Asume 29 días para Safar (mes 2). Así que tiene un pequeño error para este mes
Ali Hamidi
1
Si revisa los comentarios en mi publicación, Microsoft introdujo documentación para el calendario hijri y puede descubrir que Safar y otros meses tienen 29 días estáticos. Entonces, de alguna manera tienes razón, este es un error para esta biblioteca.
Reza Paidar