La journée commence à  midi !!!

sisopetronsisopetron Membre
14:47 modifié dans API AppKit #1
Bonjour à  tous,

Je suis confronté à  un problème que je ne m'explique pas et que je ne peux donc pas résoudre.

J'ai écris une petite routine qui calcule l'âge et qui me retourne l'âge formaté :

- (NSString *)calculAge:(NSDate *)dateDeNaissance <br />{<br />	<br />	NSDate *ajd = [NSDate date];		// date d&#39;aujourd&#39;hui<br />	<br />	// calcul de l&#39;âge<br />	NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];		<br />	NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;<br />	NSDateComponents *components = [gregorian components: unitFlags									<br />												fromDate: dateDeNaissance									<br />												&nbsp; toDate: ajd <br />												 options:0];	<br />	NSInteger age = [components year];<br />	NSInteger mois = [components month];<br />	<br />	// mise en forme<br />	NSString *ageStr = [[NSNumber numberWithInt: age] stringValue];		// passage de int en string<br />	NSString *moisStr = [[NSNumber numberWithInt: mois] stringValue];	// passage de int en string<br />	<br />	if (age &gt; 1) {<br />		ageStr = [ageStr stringByAppendingString: @&quot; ans&quot;];<br />	} else {<br />		if (age == 1) { ageStr = [ageStr stringByAppendingString: @&quot; an&quot;]; }<br />		if (age == 0) { ageStr = [moisStr stringByAppendingString: @&quot; mois&quot;]; }<br />	}<br />	<br />	// renvoi<br />	return ageStr;&nbsp; <br />}


Elle fonctionne sauf pour le jour de l'anniversaire où elle m'indique l'âge-1 avant midi et le bon âge après midi.  Par exemple, si le 03 août j'ai 49 ans, la routine me donne 48 ans jusqu'à  midi et 49 ans après.

Où se trouve le problème ?  Qui peut m'expliquer le problème ?

Merci à  vous tous.

tata !

Réponses

  • laudemalaudema Membre
    août 2010 modifié #2
    Bonjour Didier

    Une date est au format Année Jour Mois heure minutes secondes (en fait NSTimeInterval depuis la date 0)
    Si tu enregistres une date elle sera toujours de ce format et donc il sera plus ou moins un jour fonction de l'heure. Si tu veux que ça commence à  l'heure zéro tu peux bricoler une petite fonction que tu appliqueras à  tes deux dates
    <br /><br />- (NSDate *)floorDate:(NSDate)aDate{<br />	NSCalendar *cc = [NSCalendar currentCalendar];<br />	NSDateComponents *dc =[cc components:(NSYearCalendarUnit | NSMonthCalendarUnit |&nbsp; NSDayCalendarUnit) fromDate:aDate];<br />	return [cc dateFromComponents:dc];<br />}<br />
    

    Que tu peux mettre dans une catégorie de NSDate que tu crée à  l'occasion et pourra te resservir dans d'autres situations. Dans ce cas là  tu ne mets pas de paramètre (aDate) et tu utilises self à  la place dans la fonction..
  • sisopetronsisopetron Membre
    août 2010 modifié #3
    dans 1280848901:

    Que tu peux mettre dans une catégorie de NSDate que tu crée à  l'occasion et pourra te resservir dans d'autres situations. Dans ce cas là  tu ne mets pas de paramètre (aDate) et tu utilises self à  la place dans la fonction..


    Oulà , ça dépasse légèrement mes compétences en cocoa.  ;)  Je vais lire la doc des catégories et je reviens si j'ai des problèmes.

    Merci de ton aide.


    NB : c'est quand même étrange qu'il faille passer par un truc compliqué (les catégories) pour un truc somme toute banal : le début d'une journée !  Enfin, parfois je me dis que le cocoa n'a pas été créé pour simplifier la vie de l'utilisateur.  :D
  • sisopetronsisopetron Membre
    14:47 modifié #4
    Bon, me revoilà .

    J'ai créé une catégorie, c'est bien plus simple que je ne le craignais.  Par contre j'arrive pas à  l'utiliser : dans ma routine du premier post, comment dois-je intégrer ta fonction floorDate pour que ça fonctionne ?  De plus je n'ai pas compris ta remarque avec self.

    Merci.
  • laudemalaudema Membre
    août 2010 modifié #5
    dans 1280852030:

    Bon, me revoilà .

    J'ai créé une catégorie, c'est bien plus simple que je ne le craignais.  Par contre j'arrive pas à  l'utiliser : dans ma routine du premier post, comment dois-je intégrer ta fonction floorDate pour que ça fonctionne ?  De plus je n'ai pas compris ta remarque avec self.

    Merci.



    C'est tout le sel des catégories. Tu crées une catégorie pour NSDate. Et une méthode d'instance qui te renvoie une date elle fait partie de NSDate désormais. Aussi tu n'as pas besoin de passer une date, ta date c'est l'objet auquel s'applique la méthode
    <br />[maDate floorDate ];<br />
    

    et dans ta catégorie tu t'y réfères comme self. Puisque c'est une catégorie de NSDate self est l'instance de NSDate sur laquelle tu vas appliquer la fonction. ça donne
    <br />- (NSDate *)floorDate{<br />	NSCalendar *cc = [NSCalendar currentCalendar];<br />	NSDateComponents *dc =[cc components:(NSYearCalendarUnit | NSMonthCalendarUnit |<br />&nbsp; NSDayCalendarUnit) fromDate:self];<br />	return [cc dateFromComponents:dc];<br />}
    


    Avec les catégories d'une classe Apple tu peux l'étendre à  ta guise..

    Du coup Apple passe son temps ailleurs;)
    PS: tapé dans iPhone, désolé pour les erreurs du premier jet
  • sisopetronsisopetron Membre
    14:47 modifié #6
    Pigé !

    Merci ça marche. :-D

    A+
Connectez-vous ou Inscrivez-vous pour répondre.