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 :

difference entre deux dates


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 47
    Par défaut difference entre deux dates
    Bonjour,

    j'ai deux dates de type 14/05/2010 15:30:05:20 cad DD/MM/YYYY hh:mm:ss:msms.
    cette information date est enregistrer comme chaine de caractere dans un tableau parceque elle est charger a partir d'un fichier .txt

    je veux savoir comment calculer la difference entre ces deux dates et la différence sera en ms ou bien en s.... suivant un choix donner par l'utilisateur

    merci

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par rimie_rimie Voir le message
    Bonjour,

    j'ai deux dates de type 14/05/2010 15:30:05:20 cad DD/MM/YYYY hh:mm:ss:msms.
    cette information date est enregistrer comme chaine de caractere dans un tableau parceque elle est charger a partir d'un fichier .txt

    je veux savoir comment calculer la difference entre ces deux dates et la différence sera en ms ou bien en s.... suivant un choix donner par l'utilisateur

    merci
    Transformer chaque date en un entier dépends pour beaucoup du calendrier. Ce n'est pas une tâche facile, d'autant plus si tu espère respecter les normes internationales (qui, certaines années, te rajoutent une seconde à minuit le 31 décembre, histoire de faire coller le temps atomique et le temps universel).

    1) Certains OS fournissent une fonction pour faire ça à ta place (sous linux, man strptime). par contre, tu vas perdre l'information des millisecondes, il faut donc que la garde quelque part si tu en a besoin (facile : c'est la valeur après le dernier ":" de la chaine). Sinon, écrire une telle fonction n'est pas nécessairement complexe : il suffit de parser ta date et stocker le résultat dans un struct tm.

    2) sous linux et Windows, a partir du struct tm, on peut récupérer un time_t en appelant mktime(). C'est nécessaire d'en passer par là, parce qu'il faut prendre en compte tout un tas de petits détails très compliqués à implémenter soi-même. On ne peut pas faire la différence de date à partie de deux dates notées sous la forme que tu donnes, surtout si on veut une différence à la seconde près - pour la raison que j'ai donné plus haut.

    3) une fois les deux time_t obtenus, on peut travailler sérieusement : un time_t représente le nombre de secondes passées depuis epoch (un jalon dans le temps : le 01/01/1970). Les deux valeurs sont multipliées par 1000 pour y ajouter les millisecondes prélevées sur les deux dates en entrée, et on fait la différence entre les deux valeurs pour avoir un nombre de millisecondes entre ces deux dates.

    Voilà
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 47
    Par défaut
    sincerement je viens de lire ta reponse 4 fois mais j'arrive pas à bien comprendre les etapes
    merci d'eclairssir +
    sinon d'apres ce que j'ai compris il n y a pas une fonction qui calcule la difference des dates sous la fome DD/MM/YYYY hh:mm:ss:msms.
    donc je dois séparer le DD/MM/YYYY hh:mm:ss du msms et même si j'ai des mesure en microseconde par la fonction strptime et enregister la valeurs ms et microseconde dans de autres entiers. par contre j ai pas compris l'utilité de tm et ce qui suit.

    merci de me repondre le plus vite possible j'ai un delai jusqu a demain pour faire cela.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par rimie_rimie Voir le message
    sincerement je viens de lire ta reponse 4 fois mais j'arrive pas à bien comprendre les etapes
    merci d'eclairssir +
    sinon d'apres ce que j'ai compris il n y a pas une fonction qui calcule la difference des dates sous la fome DD/MM/YYYY hh:mm:ss:msms.
    donc je dois séparer le DD/MM/YYYY hh:mm:ss du msms et même si j'ai des mesure en microseconde par la fonction strptime et enregister la valeurs ms et microseconde dans de autres entiers. par contre j ai pas compris l'utilité de tm et ce qui suit.

    merci de me repondre le plus vite possible j'ai un delai jusqu a demain pour faire cela.
    Le struct tm est ce que tu obtiens lorsque tu décomposes la date avec strptime (ou ce que tu crées, si tu fait toi même la décomposition). Du coup, il faut ensuite transformer cette structure en une valeur sur laquelle tu puisse effectuer ton calcul. Hors cette transformation n'est pas triviale - elle est même extraordinairement complexe, pour des raisons qui sont elles aussi extraordinairement complexes - donc tu ne peux pas l'implémenter toit même (c'est tout à fait déconseillé). Du coup, une fois la struct tm obtenue, tu peux la passer en paramètre à mktime() qui va le faire pour toi.

    L'algo ressemble donc à (pseudo-code):

    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> // struct tm, time_t, mktime
     
    time_t diffdate(date1, date2)
    {
        struct tm tm1;
        struct tm tm2;
        int reste1;
        int reste2;
     
        // a écrire : pas compliquer, il faut juste parser la date, enregistrer
        // les informations découvertes dans un "struct tm", et stocker les
        // informations supplémentaires dans "reste"
        decompose_date(in date1, out tm1, out reste1);
        decompose_date(in date2, out tm2, out reste2);
     
        time_t t1 = mktime(in tm1) * 1000 + reste1;
        time_t t2 = mktime(in tm2) * 1000 + reste2;
     
        return reste2 - reste1;
    }
    J'insiste sur le fait qu'il s'agisse de pseudo code (d'où la présence des in / out pour marquer les paramètres de fonctions).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Par contre, si l'on multiplie par mille un time_t, vu qu'il est garanti pouvoir contenir une date exprimée en seconde mais pas forcément en milliseconde, il n'y a pas de risque d'overflow ? Il vaudrait peut-être mieux faire la difference entre les deux dates en seconde, multiplier le résultat par mille, puis y rajouter la différence entre les milliseconde, non ?

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Joe Dralliam Voir le message
    Par contre, si l'on multiplie par mille un time_t, vu qu'il est garanti pouvoir contenir une date exprimée en seconde mais pas forcément en milliseconde, il n'y a pas de risque d'overflow ? Il vaudrait peut-être mieux faire la difference entre les deux dates en seconde, multiplier le résultat par mille, puis y rajouter la différence entre les milliseconde, non ?
    If faut bien évidemment vérifier la taille d'un time_t. Sur les plateformes Windows, c'est maintenant un __int64, donc ça ne va pas créer d'overflow. Sur linux, c'est un long int (32 bits sur une plateforme 32 bits, 64 bits sinon). Du coup, pour écrire du code vraiment correct, il faut effectivement stocker la valeur dans une variable permettant de tenir 64 bits avant de faire la multiplication (la valeur actuelle renvoyée time() est de l'ordre de 2 milliards, donc on ne peut pas tenir cette valeur*1000 sur un entier de 32 bits sans overflow).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 47
    Par défaut
    Bonjour

    j'ai essayé de faire un programme mais ça marche pas: je vais laisser la partie millisecondes et microsecondes pour apres je vais essayé tt d'abord de faire marcher mon programme jusqu au seconde
    le voila merci de me dire ou est le probleme:
    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
    22
    23
    24
    #include <stdio.h>
    #include <time.h>
     
    int main()
    {
      struct tm1,tm2;
      char buf1[255], buf2[255];
      double diff;
     
      strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm1;
      strftime(buf, sizeof(buf1), "%d %b %Y %H:%M", &tm1);
      puts(buf);
      strptime("2001-11-13 05:31:01", "%Y-%m-%d %H:%M:%S", &tm2);
      strftime(buf, sizeof(buf2), "%d %b %Y %H:%M", &tm2);
      puts(buf);
      time_t  T1= mktime(tm * tim);
      time_t T2 = mktime(tm * tim);
      diff = T2 - T1;
      printf("la difference en secondes est:%d",diff);
     
     
     
      return 0;
    }

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Quelques erreur de code, que j'ai corrigé dans la version ci-après :

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include <stdio.h>
    #include <time.h>
     
    int main()
    {
      struct tm tm1;
      struct tm tm2;
     
      char buf1[255], buf2[255];
      time_t diff;
     
      strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm1);
      strftime(buf1, sizeof(buf1), "%d %b %Y %H:%M", &tm1);
      puts(buf1);
     
      strptime("2001-11-13 05:31:01", "%Y-%m-%d %H:%M:%S", &tm2);
      strftime(buf2, sizeof(buf2), "%d %b %Y %H:%M", &tm2);
      puts(buf2);
      time_t  T1= mktime(&tm1);
      time_t T2 = mktime(&tm2);
      diff = T2 - T1;
     
      printf("la difference en secondes est: %u\n",diff);
     
     
     
      return 0;
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Difference entre deux date
    Par Julien42 dans le forum Access
    Réponses: 5
    Dernier message: 11/04/2007, 15h14
  2. datediff difference entre deux dates
    Par laurent.w dans le forum Access
    Réponses: 2
    Dernier message: 04/01/2007, 11h57
  3. difference entre deux dates de type Timestamp
    Par err dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/08/2006, 18h44
  4. [VBA] Calculer la différence entre deux dates
    Par T'chab dans le forum Access
    Réponses: 13
    Dernier message: 11/05/2006, 15h12
  5. difference entre deux dates
    Par nizniz dans le forum Oracle
    Réponses: 3
    Dernier message: 09/05/2006, 11h54

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