Ich versuche, eine Datumszeichenfolge aus XML in ein NSDate-Objekt in einer iPhone-App zu analysieren
Ich bin mir dessen bewusst, dass dies zuvor gefragt wurde, aber ich glaube, ich habe die richtige Syntax, aber es funktioniert nicht. Gibt es ein Problem mit meinem Code?
Die Datumszeichenfolge, die ich analysieren muss, ist:
2011-01-21T12:26:47-05:00
Der Code, den ich zum Analysieren verwende, lautet:
self.dateFormatter = [[NSDateFormatter alloc] init];
[self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
...
else if([elementName isEqualToString:kUpdated]){
self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ];
}
Jede Hilfe sehr geschätzt. Vielen Dank!
** Basierend auf der Linkreferenz von theChrisKent habe ich das Problem so behoben:
else if([elementName isEqualToString:kLastOnDeck]){
NSString *dateStr = self.currentParsedCharacterData;
// we need to strip out the single colon
dateStr = [dateStr stringByReplacingOccurrencesOfString:@":"
withString:@""
options:0
range:NSMakeRange([dateStr length] - 5,5)];
self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr];
}
Sie brauchen nicht so viele einfache Anführungszeichen wie Sie haben (nur bei Nicht-Datums-/Uhrzeit-Zeichen erforderlich). Ändern Sie also Folgendes:
[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
Zu diesem:
[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
...
self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]];
Dokumentation hier: https://developer.Apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//Apple_ref/doc/uid/TP40002369-SW1
Unicode-Formatmuster: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns
Umgang mit Zeitzonen mit Doppelpunkten (+00: 00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/
Ich habe eine Weile gebraucht, um die einfache Antwort darauf zu finden. Es gibt viele Lösungen, bei denen zusätzlicher Code von Drittanbietern hinzugefügt wird.
Für diejenigen, die jetzt Probleme damit haben und nur iOS 6 und höher unterstützen.
Sie können den Datumsformatierer auf einstellen
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]
Und dies wird die "-05: 00" mit dem Doppelpunkt richtig behandeln.
Ich hatte am Ende die gleichen Probleme mit dem Doppelpunkt. Hier ist eine Funktion, mit der ich das Datum normalisiert habe, um NSDate
glücklich zu machen.
/**
* Timezones are returned to us in the format +nn:nn
* The date formatter currently does not support IS 8601 dates, so
* we convert timezone from the format "+07:30" to "+0730" (removing the colon) which
* can then be parsed properly.
*/
- (NSString *)applyTimezoneFixForDate:(NSString *)date {
NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch];
return [date stringByReplacingCharactersInRange:colonRange withString:@""];
}
Lösungen sollen sich ändern:
[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
Zu dieser Notation:
[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
ich hoffe es hilft dir.
Das Problem ist das 'Z' am Ende. So, wie Sie es in Anführungszeichen schreiben, erwartet Ihr Parser ein buchstäbliches Zeichen Z in Ihrer Zeitzeichenfolge, und eines ist nicht vorhanden. Was Sie möchten, ist das Z-Formatierungszeichen ohne Anführungszeichen, das angibt, dass Ihre Zeitzeichenfolge Zeitzoneninformationen enthält. Was es tut, ist -05: 00 am Ende Ihrer Zeichenfolge die Zeitzone.
Da Sie Zeitzoneninformationen erwarten, ist das Festlegen der Zeitzone in Ihrem Datumsformatierer eher sinnlos. Überprüfen Sie den Link zu den Unicode-Formatierungsmustern. Dieser Link enthält die endgültigen Informationen, denen Sie über alle Antworten, die Sie hier erhalten, vertrauen sollten.
Ich hatte großen Erfolg mit dieser Bibliothek, die als CocoaPod verfügbar ist.
https://github.com/boredzo/iso-8601-date-formatter
- (ISO8601DateFormatter *)dateFormatter
{
static ISO8601DateFormatter *dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[ISO8601DateFormatter alloc] init];
dateFormatter.includeTime = YES;
});
return dateFormatter;
}
NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"];
Ab iOS 10 ist das System NSISO8601DateFormatter für dieses bestimmte Format verfügbar.