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

Algorithmes et structures de données Discussion :

Calcul entre deux dates heures


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut Calcul entre deux dates heures
    Bonjour à tous,

    Voila mon problème, je souhaite faire des calculs entre deux heures, la première est l'heure actuelle et l'autre est une date heure que l'utilisateur peut saisir. Je souhaite avoir mon résultat en milliseconde.

    Le soucis c'est que je n'arrive pas a trouver la formule pour faire mon calcul.

    J'espère avoir été claire.
    Merci d'avance pour votre aide.

    Isa

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    s'il s'agit du meme jour et que tu souhaites juste la différence il suffit de transformer tes 2 heures X et Y en milliseconde puis de faire Y - X.
    Transformation d'une heure: H:m:s
    Y = H * 60 *60 * 1000 + m * 60 * 1000 + s * 1000

    bonne chance

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Bonjour,

    Si ce n'est pas le même jour, alors c'est plus complexe. Le 'plus simple' est alors de prendre une date de référence, de convertir chaque date en millisecondes par rapport à cette date de référence, puis de faire la diférence entre les deux, et d'appeler la fonction inverse qui transforme ces millisecondes au format humain.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 141
    Points : 139
    Points
    139
    Par défaut
    on proposerait bien le 1er janvier 1970 ...
    effectivement prendre une référence absolue me semble le plus simple.
    (sinon dans le language utilisé, il y a souvent des fonctions toutes faites)

  5. #5
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Pour ce qui est de la fonction définie je suis en Delphi 7 et elle ne me retourne pas le même résultat que mes calculs et quand je change de date elle ne marche pas. C'est pour ça que je veux faire une formule moi même.

  6. #6
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par Isa31
    Pour ce qui est de la fonction définie je suis en Delphi 7 et elle ne me retourne pas le même résultat que mes calculs et quand je change de date elle ne marche pas. C'est pour ça que je veux faire une formule moi même.
    Quelles sont tes contraintes sur les dates ? Souhaites-tu que ça fonctionne au delà de 2100 ? en deça de 2000 ? As-tu jamais l'intention de franchir un réveillon de nouvel an entre les deux dates ?

    De la réponse à ces questions dépendra la complexité de l'algorithme. Sur une année, c'est extrêmement simple. Si on a plusieurs années dans l'intervalle, c'est un chouia plus compliqué. Il faut tenir compte des années bissextiles, qui arrivent tous les 4 ans. Si tu enjambes une limite de siècle, il faudra tenir compte aussi des années séculaires qui peuvent ne pas être bissextiles, etc...J'ai une fonction perso qui fait la conversion date grégorienne -> jour julien (un compte de jours depuis la création du monde !) dans tous les cas. Je peux te l'envoyer si tu le souhaites mais elle est écrite en C. Mais si tes besoins sont plus limités (selon tes réponses aux questions ci-dessus) ça sera peut-être plus simple que je t'expose ma méthode ici.

    @+

  7. #7
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    En fait c'est à partir de la date et l'heure saisis par l'utilisateur qu'un fonction dans une des mes application, va se lancer.
    Il faut donc pouvoir le lancer 4-5 jours avant, et tenir compte des changement de mois et d'années.

  8. #8
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par Isa31
    En fait c'est à partir de la date et l'heure saisis par l'utilisateur qu'un fonction dans une des mes application, va se lancer.
    Il faut donc pouvoir le lancer 4-5 jours avant, et tenir compte des changement de mois et d'années.
    Tout compte fait, c'est plus simple pour moi de te donner la fonction générale. Voici le 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    int Gregorien_To_JJ(int angreg,int moisgreg,int jourgreg)
    {
       // Cette fonction donne la partie entière du jour julien à 0H00 du jour indiqué par
       // la date grégorienne jourgreg/moisgreg/angreg
       // Contraintes : angreg est le quantième de l'année : entre -4700 environ et +10000
       //               moisgreg est le numéro du mois 1 - pour janvier,..., 12 pour décembre
       //               jourgreg est le quantième du jour dans le mois : entre 1 et 31
       //
       // Cette fonction ne vérifie pas la validité de la date (en particulier le nombre de jours du mois)
       // Elle donnera le même résultat pour le 32/01/2005 que la date 01/02/2005
       // En prime si JJ désigne le résultat de cette fonction,
       // (jj+2) modulo 7 donne le jour de la semaine (0 pour dimanche, 6 pour samedi)
       // Pour la date du 31/03/2005 on obtient le résultat jj=2453460 et (jj+2) modulo 7 = 4 (jeudi)
       //
       // Le point important est la division entière (153*moisgreg-457)/5
       // C'est le démarrage de l'année au 1er Mars qui permet de calculer en une seule
       // division entière un décalage en nombre de jours dû au quantième du mois, en
       // s'affranchissant de l'irrégularité du mois de février, mois maudit des romains,
       // et des informaticiens...
       //
       int alfa,beta,gamma,mu,nu,delta,eta,result;
       // AB est mon année de référence, la constante JJO est la partie entière du jour julien
       // du 1er Mars 2000. S'il ne s'agit que de calculer des différences de dates, JJO ne
       // sert à rien on peut la supprimer ici et dans le calcul ci-dessous
       int AB=2000;
       int JJO=2451604;
       // Je fais démarrer l'année au 1-er mars, pour des raisons arithmétiques
       // ... et historiques
       // 25/12/2004 reste 25/12/2004
       // mais 3/01/2005 devient 3/13/2004
       // et 14/02/2005 devient 14/14/2004
       if (moisgreg<3)
       {
          moisgreg+=12;
          angreg--;
       }
       alfa=angreg-AB;
       // Dans la division suivante, j'ai ajouté 400000 avant de diviser par 400
       // en otant 1000 ensuite, pour garantir que le dividende soit toujours
       // positif.
       beta=(alfa+400000)/400-1000;
       // 146097 jours = 4 siècles grégoriens
       gamma=(alfa+400000)%400; // Il y a beta groupes de 146097 jours + gamma années
       // 36524 jours = un petit siècle grégorien (les grands font 36525 jours)
       delta=gamma/100; // Il y a delta siecles de 36524 jours plus eta années dans le siecle
       eta=gamma%100;
       mu=eta/4;
       nu=eta%4;     // Il y a mu groupes de 4 années (1461 jours) et nu années
                       // ordinaires (365 jours)
       result=((153*moisgreg-457)/5+jourgreg-1+nu*365+mu*1461+delta*36524+beta*146097+JJO);
       return result;
    }
    Ca a l'air gros, mais c'est à cause des commentaires. Sans les commentaires,...
    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
    int Gregorien_To_JJ(int angreg,int moisgreg,int jourgreg)
    {
       int alfa,beta,gamma,mu,nu,delta,eta,result;
       int AB=2000;
       int JJO=2451604;
       if (moisgreg<3)
       {
          moisgreg+=12;
          angreg--;
       }
       alfa=angreg-AB;
       beta=(alfa+400000)/400-1000;
       gamma=(alfa+400000)%400;
       delta=gamma/100;
       eta=gamma%100;
       mu=eta/4;
       nu=eta%4;
       result=((153*moisgreg-457)/5+jourgreg-1+nu*365+mu*1461+delta*36524+beta*146097+JJO);
       return result;
    }
    ça le fait aussi.

    Bon courage

  9. #9
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Merci beaucoup je vais essayer.

  10. #10
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Pour comprendre le principe:
    Comparer deux dates revient à transformer chaque date en un delta de jours pas rapport à une date référence.

    La date de référence est en général choisie pour être un lundi, 1er janvier, d'une année non bisextile.

    Le post précédent te montre l'algorithme pour transformer les dates.

    C'est d'ailleurs aussi sur ce principe que l'on peut retrouver le jour d'une date au format jj/mm/aaaa.

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

Discussions similaires

  1. calcul entre deux date et heure
    Par totor92290 dans le forum IHM
    Réponses: 2
    Dernier message: 15/03/2013, 08h18
  2. Calcul entre deux dates heures en jj:hh:mm
    Par mircla dans le forum Excel
    Réponses: 2
    Dernier message: 20/07/2011, 11h38
  3. [LV 2009] Calcul écart entre deux dates/heures
    Par K-RK-S dans le forum LabVIEW
    Réponses: 3
    Dernier message: 10/09/2010, 10h04
  4. Calcul entre deux dates + heure
    Par ifsera dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/03/2009, 14h10
  5. [Date] Calcul entre deux dates
    Par djodjo dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 14/09/2006, 14h32

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