NSDateFormatter, que je fais quelque chose de mal ou est-ce un bug?

voix
37

Je suis en train d'imprimer la date dans un certain format:

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@yyyyMMddHHmmss];
NSString *dateStr = [dateFormatter stringFromDate:today];

Si l'iPhone est réglé sur 24 temps d'une heure, cela fonctionne très bien, si d'autre part, l'utilisateur a mettre à l'heure de 24 heures, puis retour à AM / PM (cela fonctionne bien jusqu'à ce que vous appuyez sur ce paramètre), il ajoute AM / PM à la fin même si je ne pas demandé:

20080927030337 PM

Est-ce que je fais quelque chose de mal ou est-ce un bug avec le firmware 2.1?

Modifier 1: Description plus clairement

Edit 2 Solution: Il se trouve que c'est un bug, de le corriger, je mets les caractères AM et PM à « »:

[dateFormatter setAMSymbol:@];
[dateFormatter setPMSymbol:@];
Créé 27/09/2008 à 04:41
utilisateur
Dans d'autres langues...                            


8 réponses

voix
12

En utilisant le code affiché à la fois sur le simulateur et un téléphone avec le firmware 2.1 et 24 heures sur off, je ne ai jamais eu un AM / PM ajouté à chaîne_date quand je fais:

NSLog(@"%@", dateStr);

Faites-vous quelque chose d'autre avec chaîne_date que vous ne publiez pas ici? Comment allez-vous vérifier la valeur?

Suivre

Essayez d'activer le réglage am / h puis éteint. Je n'ai pas non plus le problème, jusqu'à ce que je l'ai fait. Je suis imprimer la même manière que vous êtes.

D' accord, je le vois quand je le fais aussi. Il est gotta be un bug. Je vous recommande de déposer un rapport de bogue et juste vérifier et filtrer les caractères indésirables dans l'intervalle.

Créé 27/09/2008 à 05:17
source utilisateur

voix
14

Voici l'explication du bogue SDK iPhone (également toujours là dans le SDK 3.1 beta)

Tout d'abord, un peu de fond sur l'interface utilisateur iPhone. Lorsque les utilisateurs de l'iPhone changent leur format de région entre, disons, « États-Unis » et « France », les utilisateurs de réglage « 24 heures » est automatiquement commuté sur le mode qui est le plus répandu dans cette région. En France, qui fixerait 24 heures Temps « ON », et aux États-Unis, qui fixerait à « OFF ». Les utilisateurs peuvent ensuite modifier manuellement ce paramètre et c'est où la difficulté commence.

Le problème vient de NSDateFormatter en quelque sorte se retrouver « coincés » dans le mode 12 ou de 24 heures que l'utilisateur a sélectionné manuellement. Donc, si un utilisateur français sélectionne le mode 12 heures manuellement et l'application demandée NSDateFormatter en temps de sortie avec le il serait effectivement recevoir « HHmm » format 24 heures, le temps dans un format de 12 heures, par exemple « 13:00 », comme si la demande avait plutôt demandé « hhmm aa ». L'inverse se passerait-il si un utilisateur américain mode 24 heures sélectionné manuellement: sortie temps avec le vous « aa hhmm » format 12 heures serait effectivement obtenir du temps dans le format 24 heures au lieu, par exemple, « 17:00".

Plus de détails et une solution de contournement possible se trouvent sur ce blogue .

Créé 09/12/2009 à 03:41
source utilisateur

voix
1

Pour ceux qui trouvent cette question qui veulent utiliser NSDateFormatter pour analyser 24 heures et frappent ce bogue, en utilisant NSDateComponents pour analyser les dates et heures qui ont un format connu élude cette question:

NSString *dateStr = @"2010-07-05";
NSString *timeStr = @"13:30";

NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = [[dateStr substringToIndex:4] intValue];
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue];
components.day = [[dateStr substringFromIndex:8] intValue];
components.hour = [[timeStr substringToIndex:2] intValue];
components.minute = [[timeStr substringFromIndex:3] intValue];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [calendar dateFromComponents:components];

[components release];
[calendar release];
Créé 04/07/2010 à 12:47
source utilisateur

voix
4

Je pense que c'est la solution.

NSDateFormatter *df =[[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[df setLocale: usLocale];

[usLocale release];

 NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease];

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"];

[df release];

        NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea);


//ouput  
     fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500!
Créé 16/07/2010 à 20:43
source utilisateur

voix
0

Cela devrait également travailler (je vois des résultats bizzare bien).

-(NSString*)lowLevTime:(NSString*)stringFormat {
    char buffer[50];
    const char *format = [stringFormat UTF8String];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buffer, sizeof(buffer), format, timeinfo);
    return [NSString  stringWithCString:buffer encoding:NSASCIIStringEncoding];
}
Créé 12/09/2010 à 00:48
source utilisateur

voix
9

paramètres régionaux sur formatter date en_US résout le problème pour moi:

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

Je ne sais pas si l'ajout du calendrier est également nécessaire, mais cela fonctionne bien.

Créé 20/05/2011 à 00:49
source utilisateur

voix
0

Réponse courte: essayez [dateFormatter setDateFormat:@"yyyyMMddhhmmss"];pour le format 12 heures (notez la minuscule hh).

Il a été un sujet frustrant parce que de nombreux sites Web indiquent à utiliser HHpendant des heures (y compris la documentation officiel d' Apple), mais qu'il fixe au format 24 heures, alors que hhutilise le format 12 heures. Voir http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns pour plus de détails.

En prime, notez que vous pouvez également utiliser KKou kkpour une heure du format jour, qui sera probablement hors d'un.

Mise à jour: Je regardais récemment à NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) et il semblerait que vous pouvez utiliser autoupdatingCurrentLocale pour appliquer les modifications apportées à l'intérieur de l'application à l'environnement local. Le résultat de ceci est que même si le téléphone est configuré pour utiliser une horloge de 24 heures (comme quand vous avez changé en France), vous pouvez faire un 12/24 bascule pour l'application qui aucune incidence sur les autres applications sur le téléphone, ou vous avez besoin de quitter l'application pour faire le changement.

Créé 20/06/2012 à 21:05
source utilisateur

voix
26

La raison de ce comportement est Locale, définissez les paramètres régionaux correcte, le réglage local de votre NSDateFormatter à en_US_POSIX va résoudre ce problème. Il fonctionne à la fois 24 heures et le format 12 heures.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set.De doc pomme

Essaye ça,

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];
Créé 08/11/2013 à 09:26
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more