slyderkiller
Messages postés145Date d'inscriptionlundi 28 avril 2003StatutMembreDernière intervention16 février 2012
-
18 avril 2008 à 00:01
slyderkiller
Messages postés145Date d'inscriptionlundi 28 avril 2003StatutMembreDernière intervention16 février 2012
-
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.
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 18 avril 2008 à 02:16
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;
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 18 avril 2008 à 10:29
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;
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 19 avril 2008 à 19:58
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);
}