Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Ajouter ou soustraire des heures [ Linux / Autre ] (slyderkiller)
|
Ajouter ou soustraire des heures
le 18/04/2008 00:01:37

slyderkiller
|
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.
|
|
|
|
Re : Ajouter ou soustraire des heures
le 18/04/2008 02:16:41

jfrancois
|
Réponse acceptée !
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
|
|
|
|
Re : Ajouter ou soustraire des heures
le 18/04/2008 10:29:26

jfrancois
|
Réponse acceptée !
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
|
|
|
|
Re : Ajouter ou soustraire des heures
le 19/04/2008 19:20:45

slyderkiller
|
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?
|
|
|
|
Re : Ajouter ou soustraire des heures
le 19/04/2008 19:58:49

jfrancois
|
Réponse acceptée !
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
|
|
|
|
Re : Ajouter ou soustraire des heures
le 20/04/2008 01:17:26
|
Classé sous : probleme, ajouter, heures, mm, soustraire
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 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 | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|