[Résolu] Déterminer un anniversaire avec NSDate et classes associées?

berfisberfis Membre
novembre 2013 modifié dans API AppKit #1

Bonsoir,


 


Je soumets à  votre sagacité le problème suivant:


 


Comment, à  partir d'une NSDate birthDate donnée, savoir si [NSDate date] correspond à  un anniversaire de cette birthDate?


 


La manipulation des dates, via NSCalendar et NSDateComponents, ne fournissent pas d'exemple à  ce sujet, mais montrent plutôt comment calculer la date de la fin de la 3e guerre mondiale, ce qui est amusant mais guère utile.


 


Merci!


Réponses

  • Je dirais qu'il te faut faire une comparaison des NSComponents des deux dates (birthDate et [NSDate date]), et en particulier le mois et le jour qui doivent être identiques. Ensuite, si c'est le cas tu obtiens l'âge en faisant la différence des années. 


    çà  me parait assez simple, mais je n'ai peut-être pas compris ta question.


  • Un petit exemple d'utilisation de NSDateComponents (je ne fais que de l'iOS pour l'instant, mais çà  doit être identique entre iOS et Mac) :



    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *now = [NSDate date];

    NSDateComponents *componentsToday = [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ) fromDate:now];
    NSDateComponents *components=[[NSDateComponents alloc]init];
    [components setYear:1968];
    [components setMonth:11];
    [components setDay:23];
    [components setHour:02];
    [components setMinute:30];
    [components setSecond:0];

    NSDate *birthday=[[NSCalendar currentCalendar] dateFromComponents:components];
    NSDateComponents *componentsBirthday = [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ) fromDate:birthday];

    if ([componentsBirthday day]==[componentsToday day] && [componentsToday month]==[componentsToday month]) {
    NSLog(@%ième Anniversaire,([componentsToday year]-[componentsBirthday year]));
    }

  • Merci Alf! J'avais ça entretemps: 



    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *dateNow = [[NSCalendar currentCalendar] components:unitFlags fromDate:[NSDate date]];
    NSDateComponents *dateBirth = [[NSCalendar currentCalendar] components:unitFlags fromDate:[<stored date>]];
    if (([dateBirth month]==[dateNow month])&&([dateBirth day]==[dateNow day]))
    {
    // Happy Birthday !
    }

    C'est très ressemblant. En effet, MacOS compatible !


  • En effet c'est ressemblant... J'avais dû créer un NSDate birthday, pour faire le test, mais pour ce qui te concerne, c'est une variable qui existe probablement par ailleurs.

  • Merci d'avoir répondu en tout cas !




  • Merci Alf! J'avais ça entretemps: 



    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *dateNow = [[NSCalendar currentCalendar] components:unitFlags fromDate:[NSDate date]];
    NSDateComponents *dateBirth = [[NSCalendar currentCalendar] components:unitFlags fromDate:[<stored date>]];
    if (([dateBirth month]==[dateNow month])&&([dateBirth day]==[dateNow day]))
    {
    // Happy Birthday !
    }

    C'est très ressemblant. En effet, MacOS compatible !




    Pourquoi tu mets dans le flags NSYearCalendarUnit?

  • Pour pouvoir afficher l'âge (comme le fait aussi Alf).


  • Faut pas être né un 29 février...  :p


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