Cómo analizar una cadena de fecha en un objeto NSDate en iOS?

Estoy tratando de analizar una cadena de fecha de xml en un objeto NSDate en una aplicación de iPhone

Soy consciente de que esto debe haberse preguntado antes, sin embargo, creo que tengo la syntax correcta, pero no está funcionando. ¿Hay algún problema con mi código?

La cadena de fecha que necesito analizar es:

2011-01-21T12:26:47-05:00 

El código que estoy usando para analizarlo es:

 self.dateFormatter = [[NSDateFormatter alloc] init]; [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; ... else if([elementName isEqualToString:kUpdated]){ self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ]; } 

Cualquier ayuda muy apreciada. ¡Gracias!

** Basado en la referencia de enlace de theChrisKent, solucioné el problema de la siguiente manera:

 else if([elementName isEqualToString:kLastOnDeck]){ NSString *dateStr = self.currentParsedCharacterData; // we need to strip out the single colon dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([dateStr length] - 5,5)]; self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr]; } 

No necesita tantas comillas simples como las que tiene (solo se necesitan caracteres que no sean de fecha / hora), cambie esto:

 [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 

A esto:

 [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; ... self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]]; 

Documentación aquí: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Patrones de formato Unicode: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Tratando con TimeZones con Colons (+00: 00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/

Estaba teniendo los mismos problemas con el colon al final. Aquí hay una función que utilicé para normalizar la fecha para hacer feliz a NSDate .

 /** * Timezones are returned to us in the format +nn:nn * The date formatter currently does not support IS 8601 dates, so * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which * can then be parsed properly. */ - (NSString *)applyTimezoneFixForDate:(NSString *)date { NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch]; return [date stringByReplacingCharactersInRange:colonRange withString:@""]; } 

Me tomó un tiempo encontrar la respuesta simple para esto. y hay muchas soluciones que implican traer un código de terceros adicional.

Para aquellos que están luchando con esto ahora y solo soportan iOS 6 y superior.

Puede configurar el formateador de fecha para

 [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"] 

Y esto manejará apropiadamente el “-05: 00” con los dos puntos.

Soluciones es cambiar:

 [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 

A esta notación:

 [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 

Espero que te ayude.

ISO8601DateFormatter

He tenido un gran éxito con esta biblioteca que está disponible como CocoaPod.

https://github.com/boredzo/iso-8601-date-formatter

Uso

 - (ISO8601DateFormatter *)dateFormatter { static ISO8601DateFormatter *dateFormatter = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ dateFormatter = [[ISO8601DateFormatter alloc] init]; dateFormatter.includeTime = YES; }); return dateFormatter; } NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"]; 

El problema es la ‘Z’ al final. La forma en que lo está escribiendo entre comillas, su analizador espera un carácter literal Z en su cadena de tiempo, y no hay uno. Lo que desea es el carácter de formato Z sin comillas, lo que indica que su cadena de tiempo contiene información de zona horaria. Lo que hace, el -05: 00 al final de su cadena es la zona horaria.

Como espera información de zona horaria, la configuración de la zona horaria en el formateador de fecha no tiene sentido. Y revise el enlace a los patrones de formato Unicode, ese enlace contiene la información definitiva en la que debe confiar, sobre todas las respuestas que obtenga aquí.

A partir de iOS 10, el sistema proporcionado NSISO8601DateFormatter está disponible para este formato en particular.