Convertendo um registro de data e hora ISO 8601 em um NSDate: Como lidar com o deslocamento de tempo UTC?

Estou tendo problemas para converter um timestamp ISO 8601 em um NSDate . Eu tentei usar NSDateFormatter , mas não consigo trabalhar com o deslocamento de tempo UTC que aparece no final dos timestamps. Para explicar, gostaria de converter um timestamp como o seguinte em um NSDate : 2011-03-03T06:00:00-06:00 . Minha pergunta é: como faço para lidar com a parte “-06: 00”? Eu tentei usar yyyy-MM-dd'T'HH:mm:ssZ como minha string de formato de data, mas não funciona. Alguma sugestão?

Não há necessidade de remover o:. Para lidar com o fuso horário “00:00”, você só precisa de “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) 

Objetivo-C

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

No meu caso recebi algo assim:

“2015-05-07T16: 16: 47.054403Z”

E eu tive que usar:

“aaaa ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss.SSSZ”

O problema é o caractere : dentro do deslocamento do fuso horário. Você pode remover explicitamente apenas o cólon ou remover todos os dois-pontos e prosseguir. Por exemplo:

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

Isso registra:

 EmptyFoundation[5088:707] 2011-03-03 12:00:00 +0000 

Aqui está o método que eu 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]; } 

Convertendo o timestamp ISO 8601 no NSDate no 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 

Ou opcional explicitamente:

 if let outputDate = dateFormatter.dateFromString(inputDate) { println(outputDate) //no need ! } 
    Intereting Posts