islamico gregoriano fecha conversor conversion calendario ios objective-c calendar nsdate

ios - fecha - conversor calendario islamico gregoriano



Convertir una cadena de fecha gregoriana a fecha islámica da resultados correctos e incorrectos (2)

Tengo las siguientes dos cadenas de fecha: (1) 24/04/2013 y (2) 19/03/2013 Estoy tratando de convertir estas fechas en fechas islámicas (Um Al Qura), estoy usando este bloque de código para hazlo

NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"dd/MM/yyyy"; df.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *dateInGrogrian = [df dateFromString:@"24/04/2013"]; NSDateFormatter *df2 = [[NSDateFormatter alloc] init]; NSCalendar * cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; [df2 setCalendar:cal]; [df2 setDateFormat:@"dd/MM/yyyy"]; NSLog(@"Converted date to Islamic = %@",[df2 stringFromDate:dateInGrogrian]);

si la cadena de entrada era el 24/04/2013, se mostrará el NSLog :

Converted date to Islamic = 14/06/1434 que es correcta (según el calendario islámico formal que se usa en todos los países islámicos). Pero si la cadena de entrada era 19/03/2013 el NSLog muestra:

Converted date to Islamic = 08/05/1434 que es incorrecta (según el calendario islámico, la fecha correcta debe ser 07/05/1434, que es 1 día atrás).

- Notas a considerar antes de sugerir una respuesta:

(1) Intenté usar el identificador de calendario NSIslamicCivilCalendar lugar de NSIslamicCalendar , pero fue en vano: una de las fechas convertidas era correcta y la otra era incorrecta (1 día atrás).

(2) He intentado usar la zona horaria GMT de esta manera: [df2 setTimeZone : [NSTimeZone timeZoneWithName:@"GMT"]]; , esto produjo una fecha de conversión correcta para el día (2) pero incorrecta para el día (1) (1 día atrás).

(3) He probado combinaciones de soluciones: NSIslamicCivilCalendar con / sin zona horaria GMT, NSIslamicCalendar con / sin zona horaria GMT, pero también en vano ...

¿Alguien puede proporcionar un bloque de código que satisfaga ambas fechas? así que me aseguro de que cualquier cadena de fecha gregoriana proporcionada se convierta correctamente en cadena de fecha islámica.

Muchas gracias.


Después de imprimir todas las fechas de los últimos 4 años, parece que Apple utiliza una fórmula algo aceptada para calcular matemáticamente el Calendario Islámico, ya que, como señaló Moxy, el calendario real no se basa en días científicos sino en una aproximación lunar.

Esta fórmula es que todos los meses impares tienen 30 días y todos los meses pares tienen 29 días con un día adicional agregado al último mes en cualquier año en el que el número de año 30 sea uno de los siguientes: 2, 5, 7, 10, 13, 16, 18, 21, 24, 26 o 29.

El resultado es una longitud de mes promedio de 29.53056 días, que es bastante cercana al mes lunar de 29.53059 días.

Esta fórmula se ha utilizado en otras partes de las computadoras, ya que es el único método para calcular la fecha sin utilizar una tabla de búsqueda para cada año en la historia. Como tal, a menos que escriba la tabla de búsqueda, esto será lo más preciso posible para todas las fechas que van hacia atrás y hacia adelante.


// Create a Gregorian Calendar NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // Set up components of a Gregorian date NSDateComponents *gregorianComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; NSLog(@"[In Gregorian calendar ->] Day: %ld, Month: %ld, Year:%ld", (long)[gregorianComponents day], (long)[gregorianComponents month], (long)[gregorianComponents year]); gregorianComponents.day = [gregorianComponents day]; gregorianComponents.month = [gregorianComponents month]; gregorianComponents.year = [gregorianComponents year]; // Create the date NSDate *date = [gregorianCalendar dateFromComponents:gregorianComponents]; // Then create an Islamic calendar NSCalendar *hijriCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCivilCalendar]; // And grab those date components for the same date NSDateComponents *hijriComponents = [hijriCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:date]; NSLog(@"[In Hijri calendar ->] Day: %ld, Month: %ld, Year:%ld", (long)[hijriComponents day], (long)[hijriComponents month], (long)[hijriComponents year]);