2010-12-11 3 views
12

Je rencontre un léger problème avec NSDateFormatter qui échoue sur le périphérique d'un utilisateur (renvoyant zéro lors de l'analyse d'une chaîne) et fonctionnant parfaitement lorsque je l'exécute localement (dans le simulateur ou sur mon appareil). J'essaie d'exclure ce qui pourrait causer une différence dans ce comportement. Ma première pensée a été la locale, mais j'ai essayé de la définir explicitement pour s'assurer que les mêmes paramètres locaux sont toujours utilisés, mais cela ne fait aucune différence.Comportement incohérent avec NSDateFormatter sur deux périphériques différents

Voici le code:

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

Sur l'appareil défaillant, je reçois:

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

Mais localement je reçois:

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

Cela me rend fou, je suis Il me manque quelque chose d'autre? Je cours en local 4,2 (simulateur) et sur mon appareil (un iPhone 4). Le périphérique défaillant est un 3GS fonctionnant 4.2.1.

Toutes les idées seraient grandement appréciées!

+0

Puisque vous définissez explicitement la chaîne de format, avez-vous essayé de supprimer le code de paramètres régionaux? – Costique

+0

Le paramètre "24 heures" est-il activé sur l'appareil? Voir [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html) pour plus d'informations. – Anna

+0

Oui, j'ai essayé ceci sans que les paramètres régionaux soient définis comme ci-dessus. –

Répondre

18

Je suis heureux de dire que j'ai fini par aller au fond de cette question et je dois transmettre mes remerciements à @bendodson sur Twitter pour m'avoir aidé avec ceci. aBitObvious a également abordé la question dans son commentaire ci-dessus; Je l'aurais voté si je le pouvais.

Il y avait une différence entre l'appareil de l'utilisateur et le mien, et c'était que son appareil était configuré pour utiliser l'horloge 12 heures et le mien ne l'était pas. Cette seule chose signifiait que NSDateFormatter était incapable d'analyser l'heure dans les exemples ci-dessus et renvoyait zéro.

De loin le plus gros problème pour moi avec ce problème était d'être incapable de reproduire le problème localement!

Donc, pour être clair, pour résoudre ce problème; c'est-à-dire, si vous analysez des chaînes de date/heure dans un format fixe connu (provenant souvent de certaines API comme c'était le cas dans mon cas), vous devez définir les paramètres régionaux corrects pour le formatter de date, qui sera souvent en_US_POSIX.

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

Pour plus d'informations à ce sujet, lire Apple QA1480.

+1

Merci - cela a corrigé un bug qui m'avait dérangé toute la journée! –

+0

Luke, tu es mon héros! –

+0

Hausse de Gazillion. Merci (malheureusement, je ne peux que donner 1) –

Questions connexes