2012-06-05 17 views
9

siguiente código muestra el problema: Avanzando un año completo a partir del primer día del año 1435 no se traduce en el primer día de 1436.año al calendario islámico no

Alguna idea de lo que me falta?

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 


NSCalendar *islamic = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; 
NSDate *date = [islamic dateFromComponents:components]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setCalendar:islamic]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 

NSLog(@"%@", [dateFormatter stringFromDate:date]); // -> 01.01.1435 

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setYear:1]; 

NSDate *dateWithOffset = [islamic dateByAddingComponents:offsetComponents toDate:date options:0]; 

NSLog(@"%@", [dateFormatter stringFromDate:dateWithOffset]); 
// -> 30.12.1435 ... WHY NOT 01.01.1436 ???? 
+0

No es una solución pero podría ayudar a reducir el problema: ¿Ha intentado hacer su calendario inicial con un tipo diferente, como Gregorian? Pruébalo y ve si el problema persiste para descartar o limitar el componente islámico que posiblemente tenga alguna peculiaridad que cause esto. – Dima

+0

Con otros calendarios (gregoriano, hebreo, budista) el algoritmo parece funcionar bien, al menos para los intervalos de tiempo que miré. Incluso para la mayoría de los años islámicos funciona, pero otros no. –

+0

Creé un nuevo proyecto y copié tu código en él. En iOS 4.3, 5.0 y 5.1 obtuve el resultado esperado. 'Muh. 1, 1435' y 'Muh. 1, 1436' –

Respuesta

3

Mi sospecha se debe a la diferencia entre verano/invierno (horario de verano). Muh. 1, 1435 cae el 5 de noviembre de 2013, mientras que Muh. 1, 1436 cae el 25 de octubre de 2014. La primera fecha es durante el invierno, la segunda durante el verano.

El primer NSDate que ha creado es exactamente el 5 de noviembre de 2013 00:00 (a medianoche). "dateByAddingComponents:" funciona convirtiendo los componentes a segundos y agregando eso a la primera fecha. En este caso, el resultado es el 24 de octubre de 2014 a las 23:00, debido al horario de verano.

Esto también significa que los resultados podrían ser diferentes para diferentes personas en todo el mundo debido a las diferencias de horario de verano entre las zonas horarias.

Puede evitar el problema mediante el establecimiento de la primera fecha a mediados de días, en lugar de la media noche (que es, en general, una buena idea cuando se trabaja con fechas puros):

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 
[components setHour:12]; 

Ahora, si esto es correcto El comportamiento de "dateByAddingComponents" es otra pregunta.

+0

Buen argumento :-) Quiero investigar el aspecto de la zona horaria en detalle y proporcionar comentarios al respecto. Justo ahora estoy apurado, así que tengo que pedir un poco de paciencia. –

+0

Su sospecha era correcta: la configuración explícita de timeZone (a un valor de horario de verano) para calendar, dateFormatter y NSDateComponents da como resultado los valores esperados :-) –

Cuestiones relacionadas