Format d'un NSTimeInterval

Bonsoir,


 


Je calcule l'intervalle entre deux date et je souhaite le formater en HH:MM ?


 


Pour l(instant je fais ça manu militari /3600 etc mais je pense qu'il y a probablement quelque chose qui le fait mieux.


 


Merci d'avance.


Réponses

  • AliGatorAliGator Membre, Modérateur
    août 2013 modifié #2
    Tu as NSDateFormatter mais c'est pour formatter des NSDate, donc non seulement t'oblige à  créer une [NSDate dateWithTimeinterval:] juste pour ça, mais en plus formatte plutôt des dates que des durées, donc si ton intervalle entre tes 2 dates dépasse 24h, il va afficher des jours, ...

    Tu as aussi des méthodes C plus bas niveau qui permettent de formatter ça, comme les fonctions strftime & toutes ses amies...

    [EDIT]
    Mais le mieux, c'est sans doute la méthode "- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts" de NSCalendar, j'en parle dans mon post plus bas
    [/EDIT]
  • Moi je trouve ça très bien ta méthode.


    Mais peut-être as-tu quelques chose derrière la tête en écrivant "... qui le fait mieux" ? Que reproches-tu à  ta méthode ?


     


    Après sur la forme, une petite méthode de catégorie sur NSString, et hop !


  • AliGatorAliGator Membre, Modérateur
    Ah et sinon par contre je te déconseille le calcul direct comme tu le fais (et à  jpimbert aussi du coup :D) car il faut toujours faire attention au calendier (NSCalendar) utilisé par l'utilisateur, à  vérifier que ta différence de date est également bien calculée (en particulier si entre tes 2 dates il est survenu un changement d'heure genre passage de l'heure d'été à  l'heure d'hiver, il peut donc y avoir un intervalle de non pas 2h mais 3h entre le 27 octobre à  1h et le 27 octobre à  3h ;)...)

    Le mieux est d'utiliser NSDateComponents pour tout cela.

    Par exemple, pour calculer la différence entre 2 NSDate (le temps qui sépare ces 2 dates), utilise la méthode "-[NSCalendar - components:fromDate:toDate:options:]" qui est justement faite pour. Elle te retourne un objet NSDateComponents qui te découpe directement ce temps passé en heures, minutes, secondes, jours si besoin, etc...

    Et avec le premier paramètre tu peux même préciser quel découpage tu veux, par exemple est-ce que tu veux le résultat juste en secondes (quitte à  avoir 91820 secondes), ou secondes et minutes (quitte à  avoir 1530 minutes et 20 secondes), ou heures, minutes, secondes (25h, 30 minutes, 20 secondes), ou jours+heures+minutes+secondes... etc
  • Ben moi je préfère la méthode de fleurantin pour formater un NSTimeInterval de quelques heures MAX. ça me paraà®t plus simple et plus efficace qu'avec NSCalendar que j'utilise plutôt pour calculer une différence en jours.


     


    Là  où je suis d'accord, c'est qu'il faut que l'intervalle soit calculé avec NSDate -timeIntervalSinceDate pour prendre en compte toutes les joyeusetés du calcul des dates.

  • AliGatorAliGator Membre, Modérateur
    août 2013 modifié #6

    Ben moi je préfère la méthode de fleurantin pour formater un NSTimeInterval de quelques heures MAX. ça me paraà®t plus simple et plus efficace qu'avec NSCalendar que j'utilise plutôt pour calculer une différence en jours.

    Oui je t'avoue que quand c'est juste pour un formattage heures + minutes, au final c'est vrai que c'est aussi simple.
    Mais bon fallait bien un peu de provoc' ^^ et surtout montrer une solution Cocoa et les méthodes existantes, ce qui était la question de fleurantin à  la base ;)

    Pour donner une idée du code, voilà  les 2 solutions possibles donc :
    1) Calcul manuel
    NSDate *date1 = ..., *date2 = ...;
    NSTimeInterval diff = [date2 timeIntervalSinceDate:date1];
    int h = (int)(diff / 3600);
    int m = (int)(diff / 60) % 60;
    int s = (int)(diff % 60);
    NSString* fmt = [NSString stringWithFormat:@%02d:%02d:%02d, h,m,s];
    2) Calcul avec Cocoa
    NSDate *date1 = ..., *date2 = ...;
    NSUInteger comps = (NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit);
    NSCalendarComponents* diff = [[NSCalendar currentCalendar] components:comps fromDate:date1 toDate:date2 options:0];
    NSString* fmt = [NSString stringWithFormat:@%02d:%02d:%02d, diff.hour, diff.minute, diff.second];
    Docn pour moi c'est kif-kif en terme de nombre de LOC, sauf que la 2ème méthode t'évite de faire des maths et de risquer de te gourer dans tes formules de calcul ^^ :P
  • Merci à  tous de vos lumières.


     


    Je n'avais pas pensé à  utiliser NSCalendar qui semble proposer une solution efficace.


  • Tu comptes les points Ali ?


     


    J'en suis à  1 pour moi et 8765876543234359809875 pour toi.


     


    Pour l'instant tu mènes ...


  • DrakenDraken Membre
    août 2013 modifié #9
    Soit pas triste, jp. Tu as écrasé Ali dans l'histoire des tableaux d'octets. ça compense largement !
  • AliGatorAliGator Membre, Modérateur

    Tu comptes les points Ali ?
     
    J'en suis à  1 pour moi et 8765876543234359809875 pour toi.
     
    Pour l'instant tu mènes ...

    :D

    J'en suis à  9982 messages, donc ton compte de mes points me parait quand même un peu trop flatteur ^^
    Et comme le dit Draken, tu as renversé la balance sur le sujet des char[][] où tu m'as donné un petit cours avec mpergand, et ça vaut + d'un point ça ;)
Connectez-vous ou Inscrivez-vous pour répondre.