Gibt es eine einfache Möglichkeit, um einen ISO8601-Zeitstempel auf eine formatierte NSDate der Umwandlung?

StackOverflow https://stackoverflow.com/questions/2201216

Frage

Wenn ich den folgenden Code:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

Es erfolgreich zu einem Date Objekt umgewandelt wird, aber ich kann es nicht auf andere Weise als yyyy-MM-dd'T'HH:mm zu formatieren scheinen, das heißt, was protokolliert wird ist 2010-01-28T15:22:23

Wenn ich das Datumsformat ändern zu sagen [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; das Date-Objekt ist null ...

So ist meine letzte Frage, wie aus einer SQL-Datenbank einen ISO8601 Zeitstempel zu formatieren zu verwenden, zum Beispiel NSDateFormatterMediumStyle zurückzukehren „1. Januar 2010“?

War es hilfreich?

Lösung

Sie müssen einen anderen Formatierer die Ausgabe zu behandeln. Setzen Sie diese nach Ihrem Code ein:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

Andere Tipps

Ich habe ein ähnliches, aber etwas komplexeres Problem, und ich habe eine sehr einfache Lösung gefunden!

Das Problem: Meine eingehenden ISO8601 Daten wie folgt aussehen: 2006-06-14T11:06:00+02:00 Sie haben eine Zeitzone am Ende Offset

.

Die Lösung: Ilses Peter Hosey ISO8601DateFormatter , die Sie von herunterladen können hier .

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

und

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

Hier ist Beispielcode von Apple

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

Link: https://developer.apple.com/library /ios/#qa/qa1480/_index.html

Just zu erwähnen, dass seit iOS 6.0 Sie dieses Format verwenden kann:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

Ich habe eine sehr schnelle C-Implementierung von Parsen ISO8601 NSStrings zu NSDates in SAMCategories . Sie können es mit CocoaPods installieren oder kopieren Sie einfach die Dateien zu einem Projekt.

Hier ist, wie es zu benutzen:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

Es ist sehr robust und unterstützt fehlende Zeitzonen, etc. Wie mein Kommentar über sagte NSDateFormatter für mich war sehr langsam, wenn viele Termine Parsen. Der Wechsel zu dieser Implementierung half eine immense Menge.

wird in 6-Produktion apps Dieser Code verwendet (einschließlich Hipstamatic und Roon ), die ich ohne bekannte gearbeitet Probleme. Es gibt eine Testsuite Regression zu verhindern.

Kurz gesagt, ich denke, dies ist der beste Weg ist ISO8601 Strings in Objective-C zu analysieren.


Eine kurze beiseite, wenn Sie über die Leistung und die Übertragung betroffen sind, ganze Zahlen anstelle von ISO8601 Strings sendet stark bevorzugt. Sie können sie einfach in Daten mit [NSDate dateWithTimeIntervalSince1970:yourInteger] konvertieren. Die Leistung ist so schnell, wie Sie es machen können, und es gibt weniger Zeichen über den Draht zu übertragen.

sollte ich das letzte Mal bemerke ich Äpfel NSDate Methoden überprüft nicht ISO8601 unterstützen. Ich habe immer noch einen Fehler mit Apple über in offizielle Unterstützung setzen.

+ (id)dateWithNaturalLanguageString:(NSString *)string

wird richtig (letzte Mal, dass ich es lief) analysieren und ein NSDate Objekt aus einer ISO801 Zeichenfolge erstellen, obwohl die Dokumentation sagt, dass Sie es nicht verwenden sollten, wird es auf allen ISO8601 Daten habe ich bisher ausprobiert habe.

@danielbeard Antwort für mich gearbeitet. Jedoch Sie die Zeitzone enthalten müssen sonst wandelt ein UTC-Datum in die aktuelle Zeitzone, die nicht ist, was Sie wollen.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

@Thread Kapitän Versuchen Sie, dieses Format: "yyyy-MM-dd'T'HH: mm: ss.SSS"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top