86 votes

Différence entre 'YYYY' et 'yyyy' dans NSDateFormatter

Quelle est la différence exacte entre 'YYYY' et 'yyyy'. J'ai lu dans ce lien Il stipule que

Une erreur fréquente consiste à utiliser YYYY. YYYY indique l'année civile. alors que YYYY spécifie l'année (de la "semaine de l'année"). année-semaine. Dans la plupart des cas, aaaa et YYYY donnent le même Dans la plupart des cas, aaaa et YYYY donnent le même nombre, mais ils peuvent être différents. [ ] année civile.

Mais lorsque j'essaie d'utiliser

NSString *stringDate = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000

NSString *stringDatee = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM

Comme ici, le résultat est date y datee Mais pourquoi les résultats de la date 2 et de la date 3 sont-ils différents ? Je crée une date à partir d'une chaîne de caractères et je l'inverse à nouveau en chaîne de caractères, mais les résultats ne correspondent pas ?

Quelqu'un connaît-il la raison de cette situation ? Bien qu'il s'agisse d'une semaine spécifique de l'année, je devrais quand même obtenir le même résultat.

Merci

EDIT :-

Si je code

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM

Si j'obtiens un résultat correct, mais si je passe une chaîne de caractères à la date, j'obtiens 2013-01-05 12:00:00 +0000 Je vérifie la date 2 du NSLog, résultat étrange, pourquoi ?

79voto

X-Factor Points 832

De même, lorsqu'on utilise une chaîne de format de date, il est important d'utiliser le bon format.

@"YYYY" est l'année civile basée sur la semaine.

@"yyyy" est l'année civile ordinaire.

Vous pouvez parcourir l'ensemble du blog, il est bon d'y jeter un coup d'œil.

enter image description here

https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time

http://realmacsoftware.com/blog/working-with-date-and-time (lien mort)

34voto

Gardner Bickford Points 580

Une erreur fréquente consiste à utiliser YYYY. yyyy spécifie l'année civile alors que YYYY spécifie l'année (de "Semaine de l'année"), utilisée dans le calendrier ISO année-semaine. Dans la plupart des Dans la plupart des cas, aaaa et YYYY donnent le même nombre, mais ils peuvent être différents. différents. En règle générale, il convient d'utiliser l'année civile.

de Apple Docs

4voto

gowthaman-mallow Points 642
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
              (see weekly calendar December month last Monday
              suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.

1voto

Coche Points 551

Toutes les réponses différenciées yyyy y YYYY sont de bonnes réponses pour une autre question. La question elle-même renvoie à une autre chose.

Pourquoi ces deux valeurs sont-elles différentes ? (extrait de la question)

NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM

La réponse @P.J. est qu'ils ne sont pas vraiment différents en termes de valeur. Lorsque vous enregistrez une NSDate (qui est la date 2), vous obtenez la description complète de votre objet qui se trouve être en UTC. Fuseau horaire . Cette logique ne se produit pas lors de l'enregistrement de la date 3 car elle a déjà été convertie en chaîne et a appliqué votre fuseau horaire.

Pour imprimer la date 3 de la même manière que la date 2. Vous devez spécifier le fuseau horaire UTC pour la date 3. Quelque chose comme ceci :

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); 

J'espère que cela vous aidera.

tl;dr le fuseau horaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X