Convirtiendo un sello de tiempo ISO 8601 en un NSDate: ¿Cómo se maneja uno con el desplazamiento de tiempo UTC?
(5)
Tengo problemas para convertir una marca de tiempo ISO 8601 en un NSDate
. Traté de usar NSDateFormatter
, pero no puedo hacer que funcione con la compensación de tiempo UTC que aparece al final de las marcas de tiempo. Para explicar, me gustaría convertir una marca de tiempo como la siguiente en un NSDate
: 2011-03-03T06:00:00-06:00
. Mi pregunta es: ¿Cómo trato con la parte "-06: 00"? Intenté usar yyyy-MM-dd''T''HH:mm:ssZ
como cadena de formato de fecha pero no funciona. ¿Alguna sugerencia?
Convirtiendo la marca de tiempo ISO 8601 en NSDate In Swift:
let dateFormatter = NSDateFormatter()
let inputDate = "2015-06-18T19:00:53-07:00"
dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ssZZZZ" //iso 8601
let outputDate = dateFormatter.dateFromString(inputDate)
println(outputDate!) //optional implicitly
O opcionalmente explícitamente:
if let outputDate = dateFormatter.dateFromString(inputDate) {
println(outputDate) //no need !
}
El problema es el :
carácter dentro del desplazamiento de la zona horaria. Podría eliminar explícitamente solo ese punto o eliminar todos los dos puntos y luego continuar. Por ejemplo:
NSString *s = @"2011-03-03T06:00:00-06:00";
s = [s stringByReplacingOccurrencesOfString:@":" withString:@""];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd''T''HHmmssZZ"];
NSDate *d = [f dateFromString:s];
NSLog(@"%@", d);
Estos registros:
EmptyFoundation[5088:707] 2011-03-03 12:00:00 +0000
En mi caso, recibí algo así:
"2015-05-07T16: 16: 47.054403Z"
Y tuve que usar:
"yyyy" - "MM" - "dd''T''HH": "mm": "ss.SSSZ"
Este es el método que uso:
-(NSDate *)dateFromISO8601String:(NSString *)dateString{
if (!dateString) return nil;
if ([dateString hasSuffix:@"Z"]) {
dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"-0000"];
}
dateString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd''T''HHmmssZ";
return [dateFormatter dateFromString:dateString];
}
No es necesario eliminar el: ''s. Para manejar la zona horaria de estilo "00:00", solo necesita "ZZZZ":
Rápido
let dateString = "2014-07-06T07:59:00Z"
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ssZZZZ"
dateFormatter.dateFromString(dateString)
C objetivo
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSString *input = @"2013-05-08T19:03:53+00:00";
[dateFormat setDateFormat:@"yyyy-MM-dd''T''HH:mm:ssZZZZ"]; //iso 8601 format
NSDate *output = [dateFormat dateFromString:input];
NSLog(@"Date output: %@", output);