2010-12-11 16 views
12

Tengo un pequeño problema con el fallo de NSDateFormatter en el dispositivo de un usuario (devuelve nulo al analizar una cadena) y funciona perfectamente cuando lo ejecuto localmente (ya sea en el simulador o en mi dispositivo).Comportamiento incoherente con NSDateFormatter en dos dispositivos diferentes

Estoy tratando de descartar lo que podría estar causando una diferencia en este comportamiento. Lo primero que pensé fue en la configuración regional, pero intenté configurarla de forma explícita para garantizar que siempre se usa la misma configuración regional, pero no hace ninguna diferencia.

Aquí está el código:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

NSDate *theDate = [dateFormatter dateFromString:dateString]; 
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate); 

En el dispositivo en su defecto, me sale:

PARSING DATE 2010-11-28T20:30:49-0000 AS (null) 

Pero localmente consigo:

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000 

Esto me está volviendo loco, soy Me falta algo más?

Estoy ejecutando 4.2 localmente (simulador) y en mi dispositivo (un iPhone 4). El dispositivo que falla es un 3GS que ejecuta 4.2.1.

¡Cualquier idea sería muy apreciada!

+0

Dado que configuró explícitamente la cadena de formato, ¿intentó eliminar el código de configuración regional? – Costique

+0

¿El dispositivo tiene activada la configuración "Hora de 24 horas"? Consulte [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html) para obtener más información. – Anna

+0

Sí, lo he intentado sin configurar el entorno local como se indica anteriormente. –

Respuesta

18

Me complace decir que finalmente llegué al fondo de este problema y debo transmitir mi agradecimiento al @bendodson en Twitter por ayudarme con esto. aBitObvious también acerta en el problema en su comentario anterior; Le habría votado si pudiera.

Hubo una diferencia entre el dispositivo del usuario y el mío, y eso fue que su dispositivo estaba configurado para usar el reloj de 12 horas y el mío no. Esto significa que NSDateFormatter no pudo analizar el tiempo en los ejemplos anteriores y devolvió nil.

¡El problema más grande para mí con este problema fue no poder reproducir el problema localmente!

Por lo tanto, para ser claros, para resolver este problema; es decir, si está analizando cadenas de fecha/hora que están en un formato conocido y fijo (a menudo proveniente de alguna API, como en mi caso), debe establecer la configuración regional correcta para el formateador de fecha, que a menudo será en_US_POSIX.

... 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

Para más información sobre esto, lee Apple QA1480.

+1

¡Gracias - eso corrigió un error que me había estado molestando todo el día! –

+0

Luke, eres mi héroe! –

+0

Gazillion upvotes. Gracias (desafortunadamente, solo puedo dar 1) –

Cuestiones relacionadas