Agregar el componente de año al calendar islámico falla

El siguiente código muestra el problema: Avanzar un año completo desde el primer día del año 1435 no da como resultado el primer día de 1436.

¿Alguna idea de lo que me estoy perdiendo?

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 ???? 

Mi sospecha se debe a la diferencia entre el horario de 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 date es durante el invierno, la segunda durante el verano.

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

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

Puede evitar el problema estableciendo la primera date en el medio día, en lugar de medianoche (que en general es una buena idea cuando se trabaja con dates puras):

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

Ahora bien, si este es el comportamiento correcto de "dateByAddingComponents" es otra pregunta.