IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Calculer une duree entre 2 dates


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 62
    Points : 56
    Points
    56
    Par défaut Calculer une duree entre 2 dates
    Bonjour,
    J'ai 2 date et heure à comparer, j'aimerai savoir si il existe une fonction pour retourner l'intervalle de temps entre les 2.

    J'ai essayer d'isoler chaque membre de la date et de l'heure des 2 chaines et de faire des compraisons séparement mais cela depend de trop de parametres :
    _ changement d'heure
    _ changement de jours
    _ changement de mois
    _ changement d'année

  2. #2
    Membre régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    Par défaut
    ce sujet a été traité récemment en C, ça peut sans doute t'aider : http://www.developpez.net/forums/vie...highlight=date

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    si tu lances dans le coding d'une telle fonction, ce n'est pas forcément très compliqué. ce qu'il faut, c'est bien décomposer le problème.

    tu peux passer par des fonctions intermédiaires : différence entre 2 heures, calcul du nombre d'années bissextiles entre 2 dates.

    une fois ces deux fonctions codées, ce n'est plus très compliquée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int ecart2date(date d1, date d2)
    {
       // calcul du nombre de jours séparant les dates
       // (utilise la fonction de calcul du nombre d'années bissextiles)
       int nbJours = (nbAnsBiss*366 + nbAnsPasBiss*365) + nbJoursEcoulesAnCour;
       int nbMinutes = ecart2heures(h_date1,h_date2) + nbJours*1440;
     
       return nbMinutes;
    }
    par exemple la fonction ci-dessus (une fois complétée) donne l'écart en minutes entre 2 dates. bien sur, on formate l'écart comme on veut.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 62
    Points : 56
    Points
    56
    Par défaut
    Merci mais j'ai encore 2 questions :
    Comment se compose une variable de type date car la première date recuperé et une variable en char* issue d'une trame envoyé par reseau sous forme j/m/a h:m. L'autre date est l'heure actuel que j'obtiens comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DateTime dt = DateTime::get_Now();
    char date[15], buffer[5] ;
    int jour = dt.get_Day();
    int mois = dt.get_Month();
    int annee = dt.get_Year();
    int heure = dt.get_Hour();
    int minute = dt.get_Minute();
    int seconde = dt.get_Second();
    Ensuite la 2e Question quand tu me met :
    // calcul du nombre de jours séparant les dates
    // (utilise la fonction de calcul du nombre d'années bissextiles)
    JE ne sais pas comment on les calcules ces 2 valeurs, c'est un peu la questions initiale.
    D'avance merci.
    Damien

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu peux regarder boost::date_time qui fait ce genre de calculs.
    http://www.boost.org/doc/html/date_time.html

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par d.w.d
    // calcul du nombre de jours séparant les dates
    // (utilise la fonction de calcul du nombre d'années bissextiles)
    JE ne sais pas comment on les calcules ces 2 valeurs
    bon alors j'ai un peu de temps devant moi, et ça fait longtemps que je n'ai pas fait cette exercice. donc voilà ce que ça pourrait donner "fait main" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // true si l'année est bissextile, false sinon
    bool estBissextile (int annee)
    {
       return ((annee%4==0)&&(annee%100!=0)||(annee%400==0));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // renvoie le nombre de jours dans le mois (prise en compte du février bissextile)
    int nbJours(int mois,bool biss)
    {
       bool longMois = (mois==1)||(mois==3)||(mois==5)||(mois==7)||(mois==8)||(mois==10)||(mois==12);
       if (longMois)
          return 31;
       else if (mois!=2)
          return 30;
       else if (biss)
          return 29;
       else
          return 28;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // nombre de jours ecoulés depuis le début de l'année jusqu'à la date(false)
    // ou entre la date et la fin de l'année (true) - algo
    int joursEcoules(int mois,int jour,bool biss,bool b)
    {
       int JanvDec = b ? 12 : 1;
     
       if (mois != JanvDec)
       {
          nbJoursDuMois = nbJours(mois,biss);
          mois = b ? mois+1 : mois-1;
          return joursEcoules(mois,jour,biss,b) + nbJoursDuMois;
       }
       else
       {
          return (JanvDec==1 ? jour-1 : 31-jour);
          // éventuellement +1 si on considère le jour courant ou pas
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // nombre de jours entiers séparant 2 dates (algo)
    int nbJours(date d1,date d2)
    {
       int nbJours = 0;
     
       for (int i = d1.annee(); i < d2.annee(); i++)
       {
          if (estBissextile(i))
             nbJours += 366;
          else 
             nbJours += 365;
       }
     
       nbJours += joursEcoules(d1.mois(),d1.jour(),estBissextile(d1),true);
       nbJours += joursEcoules(d2.mois(),d2.jour(),estBissextile(d2),false);
     
       return nbJours;
    }
    j'espère ne pas avoir fait (trop) d'erreurs.
    (note que ce n'est pas complètement du C++. je ne sais pas quelle classe de date tu emploies, aussi les méthodes de la classe date que j'emploie ici sont fantaisistes mais un équivalent doit exister)

  7. #7
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 62
    Points : 56
    Points
    56
    Par défaut
    Votre solution m'a l'aire interessante mais quand même compliqué.

    J'aimerai savoir si le temps entre les 2 date & heure n'exede pas 10 min.
    J'ai entendu parlé d'une fonction qui convertirai une date (objet de type date ou ensemble jour+mois+annee+heure+minute+seconde) en un nombre entier proportionnel, mais je ne me souviens plus de son nom.
    Si quelqun connait ? ? ?
    D'avance merci.
    Damien

  8. #8
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    dans le fichier d'entete <time.h>
    la structure time_t, struct tm permet de convertire une date en seconde depuis le 1er janvier 1970

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    #include <time.h>
    #include <memory.h>
    #include <iostream>
    int main(int argc, char* argv[])
    {
    	time_t seconde;
    	struct tm t;
     
    	t.tm_mday=1;
    	t.tm_mon=3;
    	t.tm_year=105;// parceque 1999=99
    	t.tm_hour=0;
    	t.tm_min=0;
    	t.tm_sec=0;
     
    	seconde= mktime(&t);
    	std::cout<<seconde<<endl;
    	return 0;
    }
    esperance que ca va t'aider

    bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer une différence entre deux dates
    Par attif0709 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/04/2010, 12h06
  2. Réponses: 3
    Dernier message: 19/09/2008, 10h35
  3. Réponses: 10
    Dernier message: 14/12/2007, 14h13
  4. CALCUL D UNE DUREE ENTRE 2 DATES SANS LES DIMANCHES
    Par sarahsonia dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 17h12
  5. [Date] Fonction de calcul de durée entre 2 dates
    Par jesus144 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/01/2006, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo