wake-up-neo.com

Wie parse ich einen Datums-String in ein NSDate-Objekt in iOS?

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];

}
49
JohnRock

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/

65
theChrisKent

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.

3
ucangetit

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:@""];
}
3
Anurag

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.

1
Badre

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. 

1
gnasher729

ISO8601DateFormatter

Ich hatte großen Erfolg mit dieser Bibliothek, die als CocoaPod verfügbar ist.

https://github.com/boredzo/iso-8601-date-formatter

Verwendungszweck

- (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.

0
BergQuester