2010-12-11 6 views
12

Ich habe ein kleines Problem mit NSDateFormatter auf dem Gerät eines Benutzers (Rückgabe Nil beim Parsen einer Zeichenfolge) und funktioniert perfekt, wenn ich es lokal ausführen (entweder im Simulator oder auf mein Gerät).Inkonsistentes Verhalten mit NSDateFormatter auf zwei verschiedenen Geräten

Ich versuche auszuschließen, was einen Unterschied in diesem Verhalten verursachen könnte. Mein erster Gedanke war das Gebietsschema, aber ich habe versucht, es explizit einzustellen, um sicherzustellen, dass immer dasselbe Gebietsschema verwendet wird, aber das macht keinen Unterschied.

Hier ist der Code:

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); 

Auf der fehlerhafte Gerät, erhalte ich:

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

Aber lokal erhalte ich:

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

Dies wird mich verrückt, bin Ich vermisse etwas anderes?

Ich bin 4.2 lokal (Simulator) und auf meinem Gerät (ein iPhone 4). Das fehlerhafte Gerät ist ein 3GS mit 4.2.1.

Alle Ideen würden sehr geschätzt werden!

+0

Da Sie die Formatzeichenfolge explizit festgelegt haben, haben Sie versucht, den Gebietsschema-Einstellungscode zu entfernen? – Costique

+0

Ist auf dem Gerät die Einstellung "24-Stunden-Zeit" aktiviert? Weitere Informationen finden Sie unter [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html). – Anna

+0

Ja, ich habe dies versucht, ohne dass das Gebietsschema wie oben eingestellt wurde. –

Antwort

18

Ich bin froh zu sagen, dass ich schließlich auf das Ende dieser Ausgabe kam, und ich muss meinen Dank an @bendodson auf Twitter für die Hilfe mit mir weiterleiten. aBitObvious traf auch auf das Problem in seinem Kommentar oben; Ich hätte ihn gewählt, wenn ich könnte.

Es gab einen Unterschied zwischen dem Gerät des Benutzers und mir, und das war, dass sein Gerät eingestellt war, um die 12-Stunden-Uhr zu verwenden, und meine war nicht. Diese einzige Sache bedeutete, dass der NSDateFormatter die Zeit in den obigen Beispielen nicht analysieren konnte und NULL zurückgab.

Bei weitem das größte Problem für mich mit diesem Problem war nicht in der Lage, das Problem lokal reproduzieren!

Also, um klar zu sein, um dieses Problem zu lösen; Das heißt, wenn Sie Datum/Uhrzeit-Strings analysieren, die in einem bekannten, festen Format vorliegen (oft von einer API kommend, wie dies in meinem Fall der Fall war), sollten Sie das richtige Gebietsschema für das Datumsformatierer festlegen, das oft en_US_POSIX sein wird.

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

Weitere Informationen zu diesem Thema lesen Apple QA1480.

+1

Danke - das hat einen Fehler behoben, der mich den ganzen Tag gestört hat! –

+0

Luke, du bist mein Held! –

+0

Gazillion upvotes. Danke (leider kann ich nur 1 geben) –

Verwandte Themen