C'è un modo semplice per convertire un timestamp ISO8601 ad un NSDate formattato?
-
18-09-2019 - |
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"?
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"