2016-05-27 5 views
0

Eine spezifische Datums- und Gebietskonfiguration von iOS macht NSDateFormatter, um ein wirklich merkwürdiges Verhalten zu haben. Es ignoriert meine Formatzeichenfolgen und formatiert Stunden mit einem Wert außerhalb des Bereichs von 0-24.NSDateFormatter formatiert Stunden im Bereich von 0-24 mit einigen internationalen Einstellungen

#define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ" 
formatter = [[NSDateFormatter alloc] init]; 
formatter.dateFormat = @DATE_FORMAT; 
return [formatter stringFromDate:value]; 

Mit benutzerdefinierten Format: "yyyy-MM-dd'T'HH:mm:ssZ" es gibt Tage, wie diese "2016.05.26 : 33: 17 PM +0000"

Es gibt keine 'T' Charakter zwischen Datum und Uhrzeit Teile und 197 Stunden

NSDateFormatter mit benutzerdefiniertem Format "yyyy-MM-dd'T'HH:mm:ss" kann String "2016-05-26T07: 32: 57" nicht analysieren und gibt nil zurück.

Dies geschieht nicht nur mit meinen benutzerdefinierten Formatierer. Interne Stiftung Formatierer für description leiden unter diesem Problem:

(lldb) po value.description 
2016-05-27 44:20:27 AM +0000 

enter image description here enter image description here

ich reproduzieren dieses Verhalten mit spezifischen System regionalen Einstellungen auf iOS 9.3.2:

"General">"Date & Time">"24-Hour Time" OFF 
"General">"Date & Time">"Set Automatically" OFF 
"General">"Date & Time">"Time Zone" Moscow 

"General">"International">"Language" Русский (Russian) 
"General">"International">"Prefferred language order" Русский (Russian), English (U.S.) 
"General">"International">"Regional Format" Russia 
"General">"International">"Calendar" Gregorian 

enter image description here enter image description here

Dies ist die einzige Konfiguration, die ich bisher kenne und die Formatierer auf diese Weise arbeiten lässt.

Weiß jemand, wie man das repariert? Ich werde jede Idee schätzen, wie ich das analysieren kann, weil ich keine eigene habe.

+1

Was passiert, wenn Sie das Gebietsschema des Formatierers auf das spezielle Gebietsschema von 'en_US_POSIX' setzen? – rmaddy

+1

Wie rmaddy empfiehlt, verwenden Sie immer das Gebietsschema 'en_US_POSIX', wenn Sie das ISO 8601/RFC 3339-Datum einstellen. Siehe [Technische Fragen und Antworten 1480] (https://developer.apple.com/library/ios/qa/qa1480/_index.html). – Rob

+0

Danke! Nächste Zeile alles behoben: formatter.locale = [NSLocale localeWithLocaleIdentifier: @ "en_US_POSIX"]; – lazarev

Antwort

0

Basierend auf dem Kommentar von rmaddy und Rob ist die richtige Lösung in dieser Situation, das Gebietsschema "en_US_POSIX" für alle Formatierer anzugeben, die an NSDate-Objekten zur Serialisierung beteiligt sind.

#define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ" 
formatter = [[NSDateFormatter alloc] init]; 
formatter.dateFormat = @DATE_FORMAT; 

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 

return [formatter stringFromDate:value]; 

die Verbindung derselben Ausgabe von Rob äußerst nützlich wäre, geschrieben haben für alle:

So betreffenden Teil snipped sollte geschrieben. See Technical Q&A 1480. Ich würde Ihnen empfehlen, es zu lesen, bevor Sie diese Lösung auf Ihren Code anwenden.

Verwandte Themen