Converti ISO 8601 in NSDate

Ho un timestamp proveniente da un server simile a questo:

2013-04-18T08:49:58.157+0000 

Ho provato a rimuovere i due punti, ho provato tutti questi:

Conversione di un timestamp ISO 8601 in un NSDate: come si gestisce l’offset dell’ora UTC?

Perché NSDateFormatter non può analizzare la data dal formato ISO 8601

Ecco dove sono a:

 + (NSDate *)dateUsingStringFromAPI:(NSString *)dateString { NSDateFormatter *dateFormatter; dateFormatter = [[NSDateFormatter alloc] init]; //@"yyyy-MM-dd'T'HH:mm:ss'Z'" - doesn't work //@"yyyy-MM-dd'T'HH:mm:ssZZZ" - doesn't work //@"yyyy-MM-dd'T'HH:mm:sss" - doesn't work [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; // NSDateFormatter does not like ISO 8601 so strip the milliseconds and timezone dateString = [dateString substringWithRange:NSMakeRange(0, [dateString length]-5)]; return [dateFormatter dateFromString:dateString]; } 

Una delle mie più grandi domande è, è il formato della data che ho sopra ISO 8601? Tutti gli esempi che ho visto dalle persone, i formati di ciascuno sono leggermente diversi. Alcuni hanno ...157-0000 , altri non hanno nulla alla fine.

Questo funziona per me:

 NSString *dateString = @"2013-04-18T08:49:58.157+0000"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; // Always use this locale when parsing fixed format date strings NSLocale *posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; [formatter setLocale:posix]; NSDate *date = [formatter dateFromString:dateString]; NSLog(@"date = %@", date); 

C’è una nuova API di Apple! NSISO8601DateFormatter

 NSString *dateSTR = @"2005-06-27T21:00:00Z"; NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init]; NSDate *date = [formatter dateFromString:dateSTR]; NSLog(@"%@", date); 

Ho anche l’API nativa, che è molto più pulita … Questa è l’implementazione che ho ottenuto nella mia class DateTimeManager:

 + (NSDate *)getDateFromISO8601:(NSString *)strDate{ NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init]; NSDate *date = [formatter dateFromString: strDate]; return date; } 

Basta copiare e incollare il metodo, farebbe il trucco. Divertirsi!