2010-09-22 12 views
6

J'utilise un NSDateFormatter pour formater un NSDate au format "HH: mm 'sur' jj MMMM YYYY".NSDateFormatter lorsque l'iPhone est réglé sur une horloge de 12 heures

C'est le code que j'ai écrit:

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 

Je suis mise à jour d'une étiquette pour afficher « données de 12h45 le 22 Septembre 2010 », selon la méthode stringFromDate.

NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]] 

L'étiquette est mis à jour correctement si le temps sur l'iPhone est réglé sur 24 heures, mais si elle est définie à 12 heures, l'étiquette affiche « Les données de (null) ».

Est-ce que quelqu'un sait comment résoudre ce problème?

Merci.

+0

Je pense que ma réponse ci-dessous devrait probablement être la réponse acceptée à ce sujet. Pouvez-vous changer OP si vous êtes d'accord? –

Répondre

6

Si la date est présentée uniquement à l'utilisateur (le "on" le suggère), je ne forcerais pas un format de date. Il est beaucoup plus facile d'utiliser la date long/moyen/court et styles temps, qui se comportent selon le format de la région de l'utilisateur:

[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 

[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

NSString * timeAndDate = [NSString stringWithFormat:"%@ on %@", 
    [timeFormatter stringFromDate:date], 
    [dateFormatter stringFromDate:date]]; 

Notez également que la configuration d'un NSDateFormatter est incroyablement cher (environ 10 ms IIRC) . C'est bien si vous ne l'affichez qu'une seule fois et que vous ne mettez pas à jour très souvent, mais cela rend le défilement un peu lent si vous avez une date par cellule de tableau. J'ai récemment fait un dessin graphique 50 fois plus rapide en mettant en cache des formateurs de date ...

+0

Merci. Je pensais que ce serait bien de forcer le format de données parce que l'application ne sera disponible qu'au Royaume-Uni. Est-il toujours préférable d'utiliser votre méthode? En outre, la date est affichée une fois sur l'écran et n'est pas modifiée très souvent. –

+0

L'utilisateur peut encore configurer le format de date (par exemple, 12 heures par rapport à 24 heures); c'est généralement une bonne idée de respecter les souhaits de l'utilisateur. –

0

J'ai exécuté ce code sur 3.1.2 et 4.1 avec les paramètres 12 et 24 heures et cela a bien fonctionné.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
    [dateFormatter setLocale:[NSLocale currentLocale]]; 

    NSString *timeAndDateUpdated = [NSString stringWithFormat:@"Data from %@.", [dateFormatter stringFromDate:[NSDate date]]]; 

    NSLog(@"%@", timeAndDateUpdated); 

Si ce code ne fonctionne pas pour vous, vérifiez les extensions personnalisées/catégories pour NSDateFormatter ou NSDate.

14

Je viens juste de me lancer là aussi.

Il semble que les dates sont analysées par NSDateFormatter en fonction des paramètres régionaux, même si vous spécifiez explicitement une chaîne de format de date! Dans ce cas, l'horloge 24 heures HH est ignorée et essaie d'analyser en utilisant l'horloge de 12 heures définie sur l'appareil.

La façon de le réparer consiste à remplacer explicitement les paramètres régionaux de NSDateFormatter; Dans cet exemple, la mise à en_US_POSIX forcera l'horloge de 24 heures à utiliser lors de l'analyse de l'heure, à savoir

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 
+0

Merci pour la mise à jour de stackoverflow Nathan, et bienvenue, upvoted. –