2010-12-11 8 views
12

Sto riscontrando un problema con NSDateFormatter che non funziona sul dispositivo di un utente (restituendo nil quando si analizza una stringa) e funziona perfettamente quando viene eseguito localmente (nel simulatore o in il mio dispositivo).Comportamento incoerente con NSDateFormatter su due dispositivi diversi

Sto cercando di escludere ciò che potrebbe causare una differenza in questo comportamento. Il mio primo pensiero è stato il locale, ma ho provato a impostarlo esplicitamente per garantire che lo stesso locale sia sempre usato, ma non fa differenza.

Ecco il codice:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

NSDate *theDate = [dateFormatter dateFromString:dateString]; 
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate); 

Sul dispositivo in mancanza, ottengo:

PARSING DATE 2010-11-28T20:30:49-0000 AS (null) 

Ma a livello locale ottengo:

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000 

Questo mi sta facendo impazzire, sono Mi manca qualcos'altro?

Sto eseguendo 4.2 localmente (simulatore) e sul mio dispositivo (un iPhone 4). Il dispositivo guasto è un 3GS in esecuzione 4.2.1.

Qualsiasi idea sarebbe molto apprezzata!

+0

Dato che hai impostato in modo esplicito la stringa di formato, hai provato a rimuovere il codice di impostazione locale? – Costique

+0

Il dispositivo ha l'impostazione "24 ore su 24" attivata? Vedi [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html) per maggiori informazioni. – Anna

+0

Sì, ho provato questo senza le impostazioni internazionali impostate come sopra. –

risposta

18

Sono lieto di dire che alla fine sono arrivato in fondo a questo problema e devo passare i miei ringraziamenti allo @bendodson su Twitter per avermi aiutato con questo. aBitObvious ha anche colpito il problema nel suo commento sopra; Lo avrei votato se potessi.

C'era una differenza tra il dispositivo dell'utente e il mio, e cioè che il suo dispositivo era impostato per utilizzare l'orologio a 12 ore e il mio no. Questa singola cosa significava che NSDateFormatter non era in grado di analizzare il tempo negli esempi precedenti e restituito nullo.

Di gran lunga il problema più grande per me con questo problema era l'incapacità di riprodurre il problema localmente!

Quindi, per essere chiari, per risolvere questo problema; cioè, se stai analizzando stringhe di data/ora che sono in un formato noto e fisso (spesso proveniente da alcune API come questo era nel mio caso), dovresti impostare le impostazioni internazionali corrette per il formattatore della data, che spesso sarà en_US_POSIX.

... 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

Per ulteriori informazioni su questo, leggere Apple QA1480.

+1

Grazie - ha corretto un errore che mi dava fastidio tutto il giorno! –

+0

Luke, sei il mio eroe! –

+0

Gazillion upvotes. Grazie (purtroppo, posso solo dare 1) –

Problemi correlati