2010-11-23 19 views
22

Aquí está mi código:NSDateFormatter dateFromString devuelve nil

NSString *_date = @"Tue, 23 Nov 2010 16:14:14 +0000"; 
NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss '+0000'"]; 
[parser setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 
NSDate *date = [parser dateFromString:_date]; 

Esto no se ejecuta: 'fecha' se establece en las negativas. Me trató con

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]; 

Sin más éxito ...

¿Tiene alguna idea?

Gracias de antemano

+1

¿En qué configuración regional está configurado su dispositivo/simulador? Esto solo funcionará si la configuración regional está configurada en inglés. –

+0

Mi configuración regional es francesa ... No pensé en eso, lástima de mí :) ¿Hay alguna manera de hacer que este código sea compatible con la mayoría de las configuraciones regionales actuales sin cambiar la fecha inicial? – Harkonnen

+1

Puede decirle a NSDateFormatter que use una configuración regional específica para el análisis (por ejemplo, en_US_POSIX). Consulte [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html). – Anna

Respuesta

53

añadir esta línea:

NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 

y funcionará. De manera predeterminada, NSDateFormatter usa la configuración regional actual del sistema, que puede variar según las preferencias del usuario actual. La cadena de fecha anterior (@"Tue, 23 Nov 2010 16:14:14 +0000") contiene palabras en inglés ("Tue", "Sep") que el formateador de fecha podría no reconocer si la configuración regional se configurara en cualquier otra cosa que no fuera inglés.

Además, los usuarios de culturas no occidentales pueden usar configuraciones regionales que usan un calendario diferente al calendario gregoriano que se usa en el mundo occidental. Si no estableció explícitamente la configuración regional, el formateador de fecha podría analizar la fecha, pero el NSDate resultante representaría un punto entero en el tiempo.

El identificador de configuración regional @"en_US_POSIX" está destinado a este fin. Se garantiza que no cambiará aunque la configuración regional @ "en_US" cambie algún día su configuración predeterminada.

+0

Muchas gracias. Está bien – Harkonnen

+0

Sería genial si puedes explicar por qué configurar el entorno local resuelve el problema. En otras palabras, ¿por qué 'dateFromString' funcionaría solo si la configuración regional está configurada en inglés de EE. UU.? – Andrew

+1

@andrewap: Actualicé mi respuesta con una explicación (y cambié mi recomendación de '@" en_US "' a '@" en_US_POSIX "', que es la solución más preparada para el futuro. –

3

El especificador de zona horaria es 'z', por lo que la cadena debe ser:

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"]; 
+0

El uso de la z es en realidad la solución más simple y limpia aquí. – Max

Cuestiones relacionadas