nsdate utc iso

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