2012-06-05 16 views
9

codice seguente problema: Advancing un anno a partire dal primo giorno dell'anno 1435 non comporta il primo giorno del 1436.Aggiunta componente anno di calendario islamico non riesce

Tutte le idee che mi manca?

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

Non una soluzione, ma potrebbe aiutare a restringere il problema: hai provato a fare il tuo calendario iniziale usando un tipo diverso, come Gregorian? Provalo e verifica se il problema si verifica ancora per escludere o restringere la componente islamica, forse con qualche stranezza che lo causa. – Dima

+0

Con altri calendari (gregoriano, ebraico, buddista) l'algoritmo sembra funzionare bene - almeno per gli intervalli di tempo che ho visto. Anche per la maggior parte degli anni islamici funziona, ma alcuni no. –

+0

Ho creato un nuovo progetto e copiato il codice in esso. Sotto iOS 4.3, 5.0 e 5.1 ho ottenuto il risultato previsto. 'Muh. 1, 1435' e 'Muh. 1, 1436' –

risposta

3

Il mio sospetto è a causa della stagione estiva/invernale (ora legale) differenza. MUH. 1, 1435 cade il 5 novembre 2013, mentre Muh. 1, 1436 cade il 25 ottobre 2014. Il primo appuntamento è durante l'inverno, il secondo durante l'estate.

Il primo NSDate creato è esattamente il 5 novembre 2013 00:00 (a mezzanotte). "dateByAddingComponents:" funziona convertendo i componenti in secondi e aggiungendoli alla prima data. In questo caso, il risultato è il 24 ottobre 2014 alle 23:00, a causa dell'ora legale.

Ciò significherebbe anche che i risultati potrebbero essere diversi per le diverse persone in tutto il mondo a causa delle differenze di ora legale tra i fusi orari.

È possibile impedire il problema impostando la prima data a metà giornata, invece di mezzanotte (che è, in generale, una buona idea quando si lavora con le date puri):

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

Ora, se questo è corretto comportamento di "dateByAddingComponents" è un'altra domanda.

+0

Buon argomento :-) Voglio approfondire l'aspetto del fuso orario in dettaglio e fornire un feedback su di esso. Proprio ora ho fretta - quindi devo elemosinare per un po 'di pazienza. –

+0

Il tuo sospetto era giusto: impostando esplicitamente il fuso orario (su un valore non di ora legale) per il calendario, dateFormatter e NSDateComponents restituisce i valori previsti :-) –

Problemi correlati