2010-02-01 5 views
24

J'ai un problème. Je reçois des chaînes de temps entrantes au format 12 heures, et je les transforme en objets NSDate. Lorsque l'iPhone est au format 12 heures, pas de problème. Mais quand c'est au format 24 heures, les choses vont mal. Voici quelques exemples de code pour démontrer:NSDateFormatter dateFromString et iPhone au format 24 heures Confusion

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM" 
NSDate *date = [formatter dateFromString:theTime]; 
NSString *theString = [formatter stringFromDate:date]; 

Dans le mode 24 heures, Date est 1970-01-01 03:19:00 et theString est "03:19" - MAL

en mode 12 heures, la date est 1970-01-01 15:19:00 et theString est "15:19" - DROIT

Alors ... question 1: Pourquoi est de 24 heures de l'appareil réglage en remplaçant mon paramètre de formatage de date?

et plus important encore, question 2: Comment obtenir une conversion correcte de 12 heures à 24 heures? J'ai déjà un code pour détecter si le téléphone est en mode 24 heures, mais à part creuser dans la chaîne et échanger le 3 avec un 15, il ne semble pas y avoir de moyen propre de le faire.

Répondre

28

Je ne sais pas si vous en avez toujours besoin, mais j'ai rencontré un problème similaire qui a été résolu en définissant les paramètres régionaux pour le formateur de date. C'est-à-dire, si vous voulez le forcer en mode 12 heures, quel que soit le réglage du mode 24/12 heures de l'utilisateur, vous devez définir les paramètres régionaux sur en_US_POSIX.

+0

Cette réponse est venue longtemps après que j'avais choisi un autre itinéraire, mais cela semble raisonnable et quelqu'un d'autre l'a vérifié, donc je vais le marquer comme étant répondu. – Silromen

+0

Comment cela a-t-il fonctionné pour vous? Je n'ai pas eu le réglage de 12 heures. – Hisenberg

+0

Merci beaucoup! Cela fonctionne maintenant .... – harshit2811

6

Je crois que @ "h: mm a" devrait être @ "HH: mm a".

Si vous utilisez le format de date de pré-construction dans le cacao, tout sera pris en compte pour vous.

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 

NSDateFormatterShortStyle et NSDateFormatterNoStyle vient dans des variétés différentes. En utilisant ceux-ci, assurez-vous de respecter les paramètres que l'utilisateur a sélectionnés pour les dates et heures. La conversion d'horloge 12-14 heures est prise en charge par le SDK, si vous avez un modèle ou un objet de valeur pour stocker vos dates essayez de les garder comme NSDate. De cette façon, vous pouvez les formater uniquement lorsque vous avez besoin de les afficher. L'enregistrement des dates sous forme de chaînes pourrait ouvrir un monde de problèmes lorsque vous les analyserez peut-être à partir de xml où le GMT est spécifié séparément ou essayez d'ajouter et de soustraire NSTimeIntervals.

+0

Merci. Je lui ai donné un tourbillon avec ce code: NSString * theTime = @ "3:19 PM"; NSDateFormatter * timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; [timeFormatter setTimeStyle: NSDateFormatterShortStyle]; [timeFormatter setDateStyle: NSDateFormatterNoStyle]; NSDate * date = [timeFormatter dateFromString: theTime]; NSString * theString = [timeFormatter stringFromDate: date]; Et la date monte jusqu'à zéro. Je suis tombé dessus plus tôt quand j'ai essayé cette route, et ça ne marche pas. Très frustrant. – Silromen

1

D'accord, je laissé un commentaire, mais il ratatinée tout le code ensemble, donc je vais devoir « répondre » à ma question avec un commentaire:

Merci. Je lui ai donné un tourbillon avec ce code:

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
NSDate *date = [timeFormatter dateFromString:theTime]; 
NSString *theString = [timeFormatter stringFromDate:date]; 

Et la date monte jusqu'à zéro. Je suis tombé dessus plus tôt quand j'ai essayé cette route, et ça ne marche pas. Très frustrant.

+0

Bonjour Silromen. Cette approche est seulement pour afficher les dates et les heures. Pour créer des dates à partir de chaînes, vous devez appliquer le format correct. Comme vous le faites ici: [formatter setDateFormat: @ "h: mm a"]; // "3:19 PM" Mais remarquez le HH au lieu de hh. – RickiG

+0

Merci pour la réponse, mais cela ne fonctionne tout simplement pas. Sur l'iPhone en mode 24 heures, 15h54 sort toujours en tant qu'objet date 03:54:00, et dans le simulateur (avec mon horloge de l'ordinateur en mode 24 heures), c'était pire: 12:54:00. – Silromen

13

La raison de ce comportement est Locale, définissez la bonne Locale

 
    NSString *strAgendaDate = @"01/17/2012 12:00 AM"; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 

    [dateFormatter setDateFormat:AgendaDateFormatForMeeting]; 
    NSDate *meetingDate = [dateFormatter dateFromString:aStrDate]; 
    [dateFormatter setDateFormat:AgendaDateRepresentation]; 
    strAgendaDate = [dateFormatter stringFromDate:meetingDate]; 

Il fonctionne à la fois le format 24 heures et 12 heures

+1

merci @Meet, c'est fou comment une ligne du code peut tout changer :) – DrPatience

+0

Merci @Meet, cela a fonctionné. –

6

J'ai changé de @ "hh: mm: ss" à @ "HH: mm: ss" et le style du temps a été changé de "13h03" à "13h03". J'espère que cela vous aidera.

Questions connexes