Es ist leicht genug, die ISO 8601-Datumszeichenfolge (zum Beispiel 2004-02-12T15:19:21+00:00
) in PHP über abzurufen date('c')
, aber wie erhält man sie in Objective-C (iPhone)? Gibt es einen ähnlich kurzen Weg, dies zu tun?
Hier ist der lange Weg, den ich gefunden habe:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Es scheint eine Menge Rigmarole für etwas so Zentrales zu sein.
ios
nsdate
nsdateformatter
iso8601
JohnK
quelle
quelle
Antworten:
Verwendung
NSDateFormatter
:Und in Swift:
quelle
setLocale
wichtigiOS 10 führt eine neue
NSISO8601DateFormatter
Klasse ein, um genau dies zu handhaben. Wenn Sie Swift 3 verwenden, sieht Ihr Code ungefähr so aus:quelle
string
enthält "2016-09-03T21: 47: 27Z".Als Ergänzung zur Antwort von Maddy sollte das Zeitzonenformat für ISO 8601 "ZZZZZ" (5 mal Z) anstelle eines einzelnen "Z" (für das RFC 822-Format) sein. Zumindest unter iOS 6.
(siehe http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
quelle
Ein häufig übersehenes Problem ist, dass Zeichenfolgen im ISO 8601-Format möglicherweise Millisekunden haben und nicht.
Mit anderen Worten, sowohl "2016-12-31T23: 59: 59.9999999" als auch "2016-12-01T00: 00: 00" sind legitim. Wenn Sie jedoch einen statisch datierten Datumsformatierer verwenden, wird einer von ihnen nicht analysiert .
Ab iOS 10 sollten Sie
ISO8601DateFormatter
alle Variationen von ISO 8601-Datumszeichenfolgen verwenden. Siehe Beispiel unten:Verwenden Sie für iOS 9 und niedriger den folgenden Ansatz mit mehreren Datenformatierern.
Ich habe keine Antwort gefunden, die beide Fälle abdeckt und diesen subtilen Unterschied abstrahiert. Hier ist die Lösung, die es anspricht:
Verwendung:
Ich empfehle außerdem, den Apple-Artikel über Datumsformatierer zu lesen.
quelle
Verwenden Sie also die Kategorie von Sam Soffee für NSDate, die Sie hier finden . Mit diesem Code, der Ihrem Projekt hinzugefügt wurde, können Sie fortan eine einzige Methode für NSDate verwenden:
Es ist nicht nur eine Zeile, es ist auch viel schneller als der NSDateFormatter-Ansatz, da es in reinem C geschrieben ist.
quelle
Ab IS8601 sind die Probleme die Darstellung und die Zeitzone
year-month-day time timezone
T
Hier sind einige gültige Zeichenfolgen
Lösungen
NSDateFormatter
Hier ist das Format, das ich in onmyway133 ISO8601 verwende
Informationen zur
Z
Kennung Datumsfeld SymboltabelleInformationen zum
locale
Formatieren von Daten mithilfe der GebietsschemaeinstellungenÜber
en_US_POSIX
Technische Q & A QA1480 NSDateFormatter und Internet TermineInteressante verwandte Fragen
quelle
Verwenden Sie einfach NSISO8601DateFormatter aus dem Foundation Framework.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
quelle
Basierend auf diesem Kern: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift kann die folgende Methode verwendet werden, um NSDate in eine ISO 8601-Datumszeichenfolge im Format JJJJ-MM zu konvertieren -dd'T'HH: mm: ss.SSSZ
quelle
S
für die Sekunde war hier entscheidendDies ist etwas einfacher und gibt das Datum in UTC ein.
quelle
Verwenden von Swift 3.0 und iOS 9.0
quelle