stats org library language objective-c formatting nsdate nsdateformatter iso

objective c - org - Convertir ISO 8601 a NSDate



r repository (3)

¡Hay una nueva API de Apple! NSISO8601DateFormatter

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

Tengo una marca de tiempo que viene del servidor que se ve así:

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

He intentado quitar los dos puntos, he intentado todo esto:

Convertir una marca de tiempo ISO 8601 en un NSDate: ¿Cómo se trata el desplazamiento de tiempo UTC?

Por qué NSDateFormatter no puede analizar la fecha del formato ISO 8601

Aquí es donde estoy:

+ (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 de mis preguntas más importantes es si el formato de fecha que tengo arriba es realmente ISO 8601? Todos los ejemplos que he visto de personas los formatos de cada uno son ligeramente diferentes. Algunos tienen ...157-0000 , otros no tienen nada al final.


Esto funciona para mí:

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


También tengo la API nativa, que es mucho más limpia ... Esta es la implementación que obtuve en mi clase DateTimeManager:

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

Solo copia y pega el método, haría el truco. ¡Disfrútala!