2010-09-22 6 views
6

Ich benutze einen NSDateFormatter, um ein NSDate im Format "HH: mm 'on' TT MMMM YYYY" zu formatieren.NSDateFormatter wenn das iPhone auf 12 Stunden eingestellt ist

Dies ist der Code, den ich geschrieben habe:

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 

Dann ein Etikett Ich bin Aktualisierung „Daten ab 12:45 am 22. September 2010“ angezeigt werden, wobei das Verfahren stringFromDate verwenden.

NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]] 

Das Etikett wird korrekt aktualisiert, wenn die Zeit auf dem iPhone bis 24 Stunden eingestellt ist, aber wenn es zu 12-Stunden-Set, das Etikett zeigt „Daten aus (null)“.

Weiß jemand, wie man dieses Problem löst?

Danke.

+0

Ich denke, meine Antwort unten wahrscheinlich die akzeptierte Antwort auf diese sein sollte. Können Sie OP ändern, wenn Sie zustimmen? –

Antwort

6

Wenn das Datum nur dem Benutzer angezeigt wird (das "on" deutet darauf hin), würde ich kein Datumsformat erzwingen. Es ist viel freundlicher, die lang/mittel/kurz Datum und Uhrzeit Arten zu verwenden, die gemäß verhalten in die Region Format des Benutzers:

[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 

[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

NSString * timeAndDate = [NSString stringWithFormat:"%@ on %@", 
    [timeFormatter stringFromDate:date], 
    [dateFormatter stringFromDate:date]]; 

Beachten Sie auch, dass ein NSDateFormatter Konfiguration ist unglaublich teuer (ca. 10 ms IIRC) . Es ist in Ordnung, wenn Sie es nur einmal anzeigen und nicht sehr oft aktualisieren, aber es macht das Scrollen ein wenig langsam, wenn Sie ein Datum pro Tabellenzelle haben. Ich habe vor kurzem Grafik-Zeichnung 50x schneller gemacht, indem ich Datum-Formatter zwischengespeichert habe ...

+0

Danke. Ich dachte, es wäre in Ordnung, das Datenformat zu erzwingen, weil die App nur in Großbritannien verfügbar sein wird. Ist es immer noch am besten, Ihre Methode zu verwenden? Auch das Datum wird einmal auf dem Bildschirm angezeigt und wird nicht sehr oft geändert. –

+0

Der Benutzer kann weiterhin das Datumsformat konfigurieren (z. B. 12 oder 24 Stunden); Es ist generell eine gute Idee, die Wünsche des Benutzers zu respektieren. –

0

Ich habe diesen Code auf 3.1.2 und 4.1 mit 12 und 24 Stunden-Einstellungen ausgeführt und es hat gut funktioniert.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
    [dateFormatter setLocale:[NSLocale currentLocale]]; 

    NSString *timeAndDateUpdated = [NSString stringWithFormat:@"Data from %@.", [dateFormatter stringFromDate:[NSDate date]]]; 

    NSLog(@"%@", timeAndDateUpdated); 

Wenn dieser Code für Sie nicht funktioniert, überprüfen Sie für kundenspezifische Erweiterungen/Kategorien für NSDateFormatter oder NSDate.

14

Ich lief gerade auch in das hinein.

Es scheint, dass Daten von der NSDateFormatter nach Gebietsschema analysiert werden, auch wenn Sie explizit eine Datumsformat-Zeichenfolge angeben!

Also in diesem Fall wird die 24-Stunden-Uhr HH ignoriert und es versucht, mit der 12-Stunden-Uhr zu analysieren, wie auf dem Gerät eingestellt.

Die Art, es zu beheben, besteht darin, das Gebietsschema von NSDateFormatter explizit zu überschreiben; in diesem Beispiel, es zu en_US_POSIX Einstellung wird die 24-Stunden-Uhr verwendet werden erzwingen, wenn die Stunde Parsen, das heißt

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 
+0

Danke für die Aktualisierung Stackoverflow Nathan, und willkommen, upvoted. –

Verwandte Themen