Pregunta

Si utilizo el siguiente código:

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

Se convirtió con éxito a un objeto Date, sin embargo, me parece que no puede formatear cualquier otra manera que yyyy-MM-dd'T'HH:mm, es decir, lo que se registra es 2010-01-28T15:22:23

Si cambio la dateFormat decir [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; el objeto Date es nulo ...

Así que mi última pregunta es cómo dar formato a una marca de tiempo ISO8601 desde una base de datos SQL para utilizar, por ejemplo, NSDateFormatterMediumStyle para volver "1 de enero 2010"?

¿Fue útil?

Solución

Es necesario otro formateador para manejar la salida. Ponga esto después de su código:

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

Otros consejos

Tengo un problema similar pero un poco más complejo, y he encontrado una solución muy simple!

El problema: Mis entrantes fechas ISO8601 tener este aspecto: 2006-06-14T11:06:00+02:00 Tienen un desplazamiento al final zona horaria

.

La solución: Utilizar de Peter Hosey ISO8601DateFormatter que se puede descargar desde rel="noreferrer"> .

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

y

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

Sólo para mencionar que desde iOS 6.0 se puede utilizar este formato:

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

Tengo una aplicación muy rápida C de analizar ISO8601 NSStrings a NSDates en SAMCategories . Se puede instalar con CocoaPods o simplemente copiar los archivos a su proyecto.

Aquí es cómo usarlo:

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

Es muy robusto y es compatible con las zonas horarias que faltan, etc. Como mi comentario anterior dijo, NSDateFormatter era muy lento para mí al analizar un montón de fechas. El cambio a esta implementación ayudó a una cantidad inmensa.

Este código se utiliza en aplicaciones de producción 6 (incluyendo Hipstamatic y Roon ) que yo he trabajado con ninguna conocida cuestiones. Hay una para evitar la regresión.

En resumen, creo que esta es la mejor manera de analizar cadenas ISO8601 en Objective-C.


A corto a un lado, si usted está preocupado por el rendimiento y la transferencia, el envío de números enteros en lugar de cadenas ISO8601 se prefiere en gran medida. Simplemente puede convertirlos en fechas con [NSDate dateWithTimeIntervalSince1970:yourInteger]. El rendimiento es tan rápido como usted puede hacerlo y hay menos caracteres para transferir sobre el alambre.

Debo señalar que la última vez que lo comprobé Manzanas métodos NSDate no apoyó ISO8601. Todavía tengo un error con Apple acerca de poner la ayuda oficial en.

+ (id)dateWithNaturalLanguageString:(NSString *)string

será adecuadamente (la última vez que me encontré) analizar y crear un objeto a partir de una cadena NSDate ISO801, aunque la documentación dice que no se debe utilizar, que ha funcionado en todas las fechas ISO8601 que he probado hasta ahora.

Respuesta @danielbeard trabajó para mí. Sin embargo es necesario incluir la zona horaria de lo contrario se convierte una fecha GMT en su zona horaria actual, que no es lo que desea.

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

capitán @Thread Prueba este formato: "aaaa-MM-dd'T'HH: mm: SS.sss"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top