Ajouter ou soustraire des heures [Résolu]

slyderkiller 146 Messages postés lundi 28 avril 2003Date d'inscription 16 février 2012 Dernière intervention - 18 avril 2008 à 00:01 - Dernière réponse : slyderkiller 146 Messages postés lundi 28 avril 2003Date d'inscription 16 février 2012 Dernière intervention
- 20 avril 2008 à 01:17
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.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 18 avril 2008 à 02:16
3
Merci
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

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 18 avril 2008 à 10:29
3
Merci
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

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 19 avril 2008 à 19:58
3
Merci
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

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
slyderkiller 146 Messages postés lundi 28 avril 2003Date d'inscription 16 février 2012 Dernière intervention - 19 avril 2008 à 19:20
0
Merci
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?
Commenter la réponse de slyderkiller
slyderkiller 146 Messages postés lundi 28 avril 2003Date d'inscription 16 février 2012 Dernière intervention - 20 avril 2008 à 01:17
0
Merci
Merci beaucoup Jean-François
Commenter la réponse de slyderkiller

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.