2015-09-19 8 views
8

Eine meiner Apps hat ein Problem, nachdem sie auf einem Gerät ausgeführt wurde, das gerade auf iOS9 aktualisiert wurde (Ziel der App ist 8.1).NSDateFormatter.dateFromString gibt null nach iOS9-Upgrade zurück

Die App funktioniert gut vor iOS9, jedoch nach NUR Upgrade auf iOS9 auf dem Gerät das folgende Problem passiert.

Die Variable 'anObsDate' gibt jetzt null zurück. Ich habe keine Idee warum. Es scheint, dass das Standalone-Upgrade von iOS9 auf dem Host-Gerät dieses Problem ausgelöst hat.

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Wenn ich die App mit dem folgenden Debug laufen, haben wir diese Ausgabe:

 NSLog(@"Timestamp %@", [anObs timeStamp]); 
    NSLog(@"Formatter %@", [self bomDateFormatter]); 
    NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Timestamp 2015-09-17 00:01:10 
Formatter <NSDateFormatter: 0x7fe7abc653c0> 

ich mein Date Formatierer wie folgt festgelegt:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]; 
NSDateFormatter *countDownFormatter = [[NSDateFormatter alloc] init]; 
[countDownFormatter setLocale:locale]; 
[countDownFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Melbourne"]]; 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"]; 
return countDownFormatter; 

wieder machen dies deutlich , wenn ich meine App auf einem vor iOS9-Gerät ausführen, funktioniert alles einwandfrei, und dateFromString gibt ein NSDate zurück. Nach dem Upgrade auf iOS9 gibt dateFromString null zurück.

Irgendwelche Vorschläge?

Danke.

Antwort

6

Es scheint, dass NSDateFormatter Verhalten in iOS 9 geändert hat, so dass einzelne in Anführungszeichen gesetzte Zeichen im Datumsformat mit den Zeichen in der Zeichenfolge genau übereinstimmen müssen. Zuvor würde es ein beliebiges Zeichen akzeptieren (durchsucht die Dokumente, aber konnte keine Erwähnung dieser Änderung finden).

Der Timestamp-Zeichenfolge fehlt das "T", das im Datumsformat definiert ist. Versuchen Sie Ihr Date Formatwechsel zu:

// Note the "T" has been removed 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"]; 

Die andere Option, die „T“ in den Zeitstempel Zeichenfolge hinzuzufügen wäre:

// Note the "T" has been added 
2015-09-17T00:01:10 

Dies sollte mit früheren Versionen von iOS rückwärts kompatibel sein.

+0

Spot on. Ich habe das 'T' aus meinem Datumsformat entfernt und das Problem behoben. Trotzdem hätte ich nicht erwartet, dass ich das mit einem eigenständigen iOS-Update machen müsste. – ack

+0

Einverstanden. Wahrscheinlich einen Fehlerbericht an Apple wert. – ospr

+2

Apple hat mich daran erinnert, dass Gebietsschemata wie "en_AU" Konstrukte sind, die dem Benutzer zugewandt sind und sie * sich regelmäßig ändern *. Zum Beispiel änderte sich um 1966 die en_AU von der Arbeit mit "£" in die Arbeit mit "$". Datumsformatzeichenfolgen garantieren keine Stabilität in einem benutzerbezogenen Gebietsschema. Sie empfehlen en_US_POSIX, das ein festes Gebietsschema sein soll, das sich nie ändert. Das Problem, das ich oben gemeldet habe, existiert jedoch weiterhin mit en_US_POSIX ... Die Tatsache, dass ein gültiges NSDate zurückgegeben wurde, wenn der Zeichenfolgenformatierer und die Zeichenfolge nicht übereinstimmten, ist selbst ein Fehler; das scheint bei iOS9 behoben worden zu sein. – ack

3

Das ist mein Problem gelöst. Sie können es auch verwenden.

In Objective C:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 

In Swift:

let dateFormatter = NSDateFormatter()  
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")