web-dev-qa-db-fra.com

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

Quelle est la différence exacte entre 'YYYY' et 'yyyy'. Je lis dans ce lien , il est écrit que 

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

Mais quand 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, résultat date et datee différent, ce que j'ai compris, mais pourquoi le résultat de la date 2 et de la date 3 est-il différent? Lorsque je crée la date d'une chaîne et que je retourne la même chose en chaîne, mais que les différences de sortie sont identiques?

Quelqu'un at-il une raison à propos de la même chose? Bien que cela spécifie la semaine de l'année, je devrais quand même obtenir le même résultat.

Merci..

MODIFIER :-

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 les résultats me donnent un résultat correct, mais identique à celui que je passe sous forme de chaîne à date, je reçois 2013-01-05 12:00:00 +0000, vérifiez la date 2 de NSLog, résultat étrange, pourquoi?

55
P.J

Il est également important d’utiliser une chaîne de format de date avec le format correct.

@ "AAAA" est une année civile basée sur la semaine.

@ "aaaa" est une année civile ordinaire.

Vous pouvez parcourir tout le blog, c’est bien de le regarder.

http://realmacsoftware.com/blog/working-with-date-and-time

48
X-Factor

Une erreur courante consiste à utiliser AAAA aaaa spécifie l'année civile alors que AAAA spécifie l'année (de “Semaine de l'année”), utilisé dans le calendrier année-semaine ISO. Dans la plupart yyyy et YYYY donnent le même nombre, quelle qu’elle soit différent. En règle générale, vous devez utiliser l'année civile.

à partir de Apple Docs

22
Gardner Bickford
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.
4
gowthaman-mallow

Toutes les réponses différenciant yyyy et YYYY sont des réponses correctes pour une autre question. La question elle-même fait référence à 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 ici @ P.J est qu’elles n’ont pas vraiment de valeur différente. Lorsque vous enregistrez une date NSDate (Date 2), vous obtenez la description complète de votre objet qui se trouve être au format UTC Timezone . Cette logique ne se produit pas lors de la journalisation de la date 3, car elle a déjà été convertie en chaîne et a appliqué votre fuseau horaire. 

Pour imprimer Date 3 de la même manière que vous obtenez Date 2. Vous devez spécifier le fuseau horaire UTC pour Date 3. Quelque chose comme ce qui suit:

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 t'aides.

tl; dr le fuseau horaire

1
CoderPug