Domanda

Se uso il seguente codice:

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

Si è convertito con successo ad un oggetto Date, però, non posso sembrare formattarlo altro modo che yyyy-MM-dd'T'HH:mm, vale a dire ciò che viene registrato è 2010-01-28T15:22:23

Se cambio la dateFormat dire [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; l'oggetto Date è nullo ...

Quindi la mia domanda finale è come formattare un timestamp ISO8601 da un database SQL da utilizzare, per esempio, NSDateFormatterMediumStyle di tornare "1 gen 2010"?

È stato utile?

Soluzione

È necessario un altro formattatore per gestire l'uscita. Mettete questo dopo il vostro codice:

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

Altri suggerimenti

Ho un simile problema, ma un po 'più complesso, e ho trovato una soluzione molto semplice!

Il problema: Con le date ISO8601 in entrata simile a questa: 2006-06-14T11:06:00+02:00 Hanno un offset alla fine fuso orario

.

La soluzione: Utilizzare di Peter Hosey ISO8601DateFormatter che può essere scaricato da qui .

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

e

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

Ecco il codice di esempio da 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

Solo per ricordare che da quando iOS 6.0 è possibile utilizzare questo formato:

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

ho un'implementazione molto veloce C di parsing ISO8601 NSStrings a NSDates in SAMCategories . È possibile installarlo con CocoaPods o semplicemente copiare i file al progetto.

Ecco come usarlo:

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

E 'molto robusto e supporta fusi orari mancanti, ecc come mio commento sopra detto, NSDateFormatter era molto lento per me durante l'analisi di un sacco di date. Il passaggio a questa implementazione ha aiutato una quantità immensa.

Questo codice viene utilizzato in 6 applicazioni di produzione (compresi Hipstamatic e Roon ) che ho lavorato con nessuna nota problemi. C'è un per evitare la regressione.

In breve, credo che questo sia il modo migliore per analizzare le stringhe ISO8601 in Objective-C.


Una breve parte, se sei preoccupato per le prestazioni e il trasferimento, l'invio di interi anziché stringhe ISO8601 è notevolmente preferito. Si può semplicemente convertirli in date con [NSDate dateWithTimeIntervalSince1970:yourInteger]. Le prestazioni sono veloce come si può rendere e ci sono meno caratteri per trasferire sul filo.

Vorrei sottolineare che l'ultima volta che ho controllato Mele metodi NSDate non supportava ISO8601. Ho ancora un bug con Apple di mettere sostegno pubblico.

+ (id)dateWithNaturalLanguageString:(NSString *)string

sarà correttamente (l'ultima volta che mi sono imbattuto) analizzare e creare un oggetto NSDate da una stringa ISO801, anche se la documentazione dice che non si dovrebbe usare, è lavorato su tutte le date ISO8601 che ho provato finora.

Risposta @danielbeard ha lavorato per me. Tuttavia è necessario includere il fuso orario altrimenti converte una data UTC nel vostro fuso orario corrente che non è ciò che si desidera.

- (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;
}

capitano @Thread Prova questo formato: "AAAA-MM-dd'T'HH: mm: ss.SSS"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top