43 votes

Générer NSDate à partir du jour, du mois et de l'année

J'essaie de générer un NSDate à partir d'un mois, d'un jour et d'une année (le tout au format entier).

En ce moment ma tentative est telle:

 NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
NSNumber *day = [dataSource valueForKey:@"day"];
NSNumber *month = [dataSource valueForKey:@"month"];
NSNumber *year = [dataSource valueForKey:@"year"];
[components setDay:[day intValue]];
[components setMonth:[month intValue]];
[components setMonth:[year intValue]];
NSDate *_date = [calendar dateFromComponents:components];

Cependant, _date génère ce qui suit lorsque jour = 24, mois = 8, année = 2011 :

0168-07-25 04:56:02 +0000

Je dois faire quelque chose d'horriblement mal, mais je n'ai aucune idée de quoi. Quelqu'un sait ce qui pourrait se passer ?

43voto

Christopher A Points 1806

Vous avez une faute de frappe dans votre code : (la dernière ligne doit être setYear: )

  [components setDay:[day intValue]];
 [components setMonth:[month intValue]];
 [components setYear:[year intValue]];

3voto

wmorrison365 Points 1774

Un problème flagrant est:

 [components setMonth:[year intValue]];    //setting month with year!

2voto

Peter Rebholz Points 78

Vous appelez setMonth deux fois, la deuxième fois avec la valeur de l'année. Devrait être:

 [components setDay:[day intValue]];
[components setMonth:[month intValue]];
[components setYear:[year intValue]];

1voto

vadian Points 29149

Outre la faute de frappe de nos jours (2019), il existe une syntaxe plus pratique pour accéder aux valeurs du dictionnaire avec l'abonnement clé et aux propriétés avec la notation par points

 NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
NSNumber *day = dataSource[@"day"];
NSNumber *month = dataSource[@"month"];
NSNumber *year = dataSource[@"year"];
components.day = day.integerValue;
components.month = month.integerValue;
components.year = year.integerValue;
NSDate *_date = [calendar dateFromComponents:components];

et il existe une autre API sans composants de date

 NSCalendar *calendar = [NSCalendar currentCalendar];
NSNumber *day = dataSource[@"day"];
NSNumber *month = dataSource[@"month"];
NSNumber *year = dataSource[@"year"];
NSDate *_date = [calendar dateWithEra:1 year:year.integerValue month:month.integerValue day:day.integerValue hour:0 minute:0 second:0 nanosecond:0];

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