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!