Ajouter ou soustraire des heures [Résolu]

Signaler
Messages postés
146
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
16 février 2012
-
slyderkiller
Messages postés
146
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
16 février 2012
-
slt a tt

Voila mon probleme.
j'ai une variable au format "HH:MM:SS" en char
et je voudrais soustraire a une variable Char qui contien la date "dd/mm/yy HH:MM:SS"

Par exemple si ma date est 17/04/08 23:00:00 est que mon heure a soustraire est 02:00:00 je voudrais que ca me retourne 17/04/08 21:00:00 j'ai fais ca en vb.net sans probleme mais en c sous linux la je n'arrive pas si quelqu'un a la sollution merci bien.

5 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonsoir,

Voila un exemple possible en C/C++ :

#include <stdio.h>



const char* CalculerDate
(
    const char* pszDate     // E:horodate à traiter
   ,const char* pszHoraire  // E:horaire à soustraire
   ,char*       pszResultat // S:résultat
)                           // S:résultat
{
   // --- Extraire les données de la date
   int annee,mois,jour,heure,minute,seconde;
   sscanf(pszDate,"%d/%d/%d %d:%d:%d"
         ,&annee,&mois,&jour,&heure,&minute,&seconde);
   int sec = (heure * 3600) + (minute * 60) + seconde;




   // --- Extraire les données de l'horaire à soustraire
   int heure2,minute2,seconde2;
   sscanf(pszHoraire,"%d:%d:%d",&heure2,&minute2,&seconde2);
   int sec2 = (heure2 * 3600) + (minute2 * 60) + seconde2;




   // --- Soustraire
   // --- (SANS GERER UN ÉVENTUEL CHANGEMENT DE DATE)
   sec    -= sec2;
   heure   = sec / 3600;
   sec    -= heure * 3600;
   minute  = sec / 60;
   sec    -= minute * 60;
   seconde = sec;




   // --- Formater le  résultat
   sprintf(pszResultat,"%02d/%02d/%02d %02d:%02d:%02d"
          ,annee,mois,jour,heure,minute,seconde);
   return pszResultat;
}



void main()
{
   char* szDate    = "17/04/08 23:00:00";
   char* szHoraire = "02:00:00";
   char  szResultat[32];



   printf("%s - %s = %s\n"
         ,szDate
         ,szHoraire
         ,CalculerDate(szDate,szHoraire,szResultat));
}


Ce qui donne :

17/04/08 23:00:00 - 02:00:00 = 17/04/08 21:00:00



Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Voila mieux pour tenir compte du changement de date (et sans l'inversion jour/annee faite dans l'exemple précédent) :

#include <stdio.h>
#include <time.h>



const char* CalculerDate
(
    const char* pszDate     // E:horodate à traiter
   ,const char* pszHoraire  // E:horaire à soustraire
   ,char*       pszResultat // S:résultat
)                           // S:résultat
{
   // --- Extraire les données de la date
   // --- (l'année est sur 2 chiffres à partir de 2000)
   int annee,mois,jour,heure,minute,seconde;
   sscanf(pszDate,"%d/%d/%d %d:%d:%d"
         ,&jour,&mois,&annee,&heure,&minute,&seconde);
   tm TM = {seconde,minute,heure,jour,mois - 1,annee + 100,0,0,-1};
   time_t T = mktime(&TM);




   // --- Extraire les données de l'horaire à soustraire
   int heure2,minute2,seconde2;
   sscanf(pszHoraire,"%d:%d:%d",&heure2,&minute2,&seconde2);
   int sec2 = (heure2 * 3600) + (minute2 * 60) + seconde2;




   // --- Soustraire l'horaire de la date
   T -= (time_t)sec2;



   // --- Formater la date résultante
   tm* pTM = localtime(&T);
   sprintf(pszResultat,"%02d/%02d/%02d %02d:%02d:%02d"
          ,pTM->tm_mday,pTM->tm_mon + 1,pTM->tm_year - 100
          ,pTM->tm_hour,pTM->tm_min,pTM->tm_sec);
   return pszResultat;
}



void main()
{
   const char* szDate1   = "17/04/08 23:00:00"; // sans chgt date
   const char* szDate2   = "01/01/08 01:00:00"; // avec chgt date
   const char* szHoraire = "02:00:00";
   char szResultat[32];



   printf("%s - %s = %s\n"
         ,szDate1
         ,szHoraire
         ,CalculerDate(szDate1,szHoraire,szResultat));
   printf("%s - %s = %s\n"
         ,szDate2
         ,szHoraire
         ,CalculerDate(szDate2,szHoraire,szResultat));
}


ce qui donne :

17/04/08 23:00:00 - 02:00:00 = 17/04/08 21:00:00
01/01/08 01:00:00 - 02:00:00 = 31/12/07 23:00:00



Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Aucune fonction C/C++ de base ne fera ça ! c'est une horreur propre à d'autres langages comme Basic. On ne calcule pas sur des caractères (surtout des calculs aussi particuliers que des calculs de dates avec tout ce que cela implique). A un moment ou à un autre, il faut bien passer par des nombres !

La fonction CalculerDate() proposée traite les 2 dates sous forme de chaînes de caractères et se charge des conversions et calculs.

Voici une version adaptée pour faire l''équivalent de datediff du Basic :

#include <stdio.h>
#include <time.h>



double DateDiff
(
    const char* pszDate1 // E:horodate 1
   ,const char* pszDate2 // E:horodate 2
)                        // S:différence en secondes
{
   // --- Extraire les données de la date 1
   // --- (l'année est sur 2 chiffres à partir de 2000)
   int annee1,mois1,jour1,heure1,minute1,seconde1;
   sscanf(pszDate1,"%d/%d/%d %d:%d:%d"
         ,&jour1,&mois1,&annee1,&heure1,&minute1,&seconde1);
   tm TM1 = {seconde1,minute1,heure1,jour1,mois1 - 1,annee1 + 100,0,0,-1};
   time_t T1 = mktime(&TM1);




   // --- Extraire les données de la date 2
   // --- (l'année est sur 2 chiffres à partir de 2000)
   int annee2,mois2,jour2,heure2,minute2,seconde2;
   sscanf(pszDate2,"%d/%d/%d %d:%d:%d"
         ,&jour2,&mois2,&annee2,&heure2,&minute2,&seconde2);
   tm TM2 = {seconde2,minute2,heure2,jour2,mois2 - 1,annee2 + 100,0,0,-1};
   time_t T2 = mktime(&TM2);




   // --- Retourner la différence en secondes
   return difftime(T1,T2);
}



void main()
{
   const char* szDate1 = "17/04/08 23:01:01";
   const char* szDate2 = "16/04/08 23:00:00";



   printf("%s - %s = %.0lf secondes\n"
         ,szDate1
         ,szDate2
         ,DateDiff(szDate1,szDate2));
}


Ce qui donne :

17/04/08 23:00:00 - 16/04/08 23:00:00 = 86461 secondes



Jean-François
Messages postés
146
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
16 février 2012

slt a tt

Merci bien impecable et une autre question lol si je veux utiliser datediff avec mes dates en Char pour avoir la differance en seconde entre 2 dates?
Messages postés
146
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
16 février 2012

Merci beaucoup Jean-François