Bonjour,
J'ai un programme développé en C++ qui doit aussi bien fonctionné sous WIN32 que sur Linux. Et je souhaite, autant que possible, faire un code qui est compilable pour les 2 plateformes. Mais là j'ai un problème avec l'utilisation de time.h.
Mon outil de travail sous WIN32 est Microsoft Visual C++.
Je souhaite faire une fonction qui va soustraire un nombre d'heure à une date.
J'ai mis 2 paramètres d'entrée: la date et le nombre d'heure à soustraire et en sortie je renvoie la nouvelle date.
Sous WIN32, j'ai fait comme ceci:
Ceci fonctionne correctement sous WIN32. Cela fonctionne également sous Linux si je donne en entrée une date qui aura le même décalage par rapport au GMT que le décalage actuel (GMT+1).
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 /** * @param string _datetime: a Datetime in the syntax yyyymmddhhmm. * @param int _hours: a number of hours to retrieve to _datetime. * @return a new date in the syntax yyyymmddhhmm. */ string getTime(string _datetime, int _hours) { time_t rawtime; struct tm * timeinfo; /* get current timeinfo and modify it to a structure tm */ time (&rawtime); timeinfo = localtime (&rawtime); timeinfo->tm_year = atoi(_datetime.substr(0,4).c_str()) - 1900; timeinfo->tm_mon = atoi(_datetime.substr(4,2).c_str()) - 1; timeinfo->tm_mday = atoi(_datetime.substr(6,2).c_str()); timeinfo->tm_hour = atoi(_datetime.substr(8,2).c_str()) + _hours; timeinfo->tm_min = atoi(_datetime.substr(10,2).c_str()); timeinfo->tm_sec = 0; rawtime = mktime (timeinfo); timeinfo = localtime (&rawtime); /* La classe MDate est développé par mes soins et sa fonction toString() renvoie la date au format souhaité */ MDate _date; _date.clear(); _date.setYear(timeinfo->tm_year + 1900); _date.setMonth(timeinfo->tm_mon + 1); _date.setDay(timeinfo->tm_mday); _date.setHour(timeinfo->tm_hour); _date.setMinute(timeinfo->tm_min); return _date.toString(); }
Mais si en entrée je donne la date suivante: 200610280000 (soit le 28 Oct 2006 à 00:00 - le décalage par rapport à GMT était alors de GMT+2 dû à l'heure d'été), dans ce cas la date renvoyée en sortie est (la date voulue)+1 heure.
J'ai trouvé une solution qui marche exclusivement sous Linux:
J'ai remplacé les fonctions localtime() par gmtime() et mktime() par timegm(). Le soucis, c'est que la fonction timegm() n'existe pas sous Visual C++.
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 /** * @param string _datetime: a Datetime in the syntax yyyymmddhhmm. * @param int _hours: a number of hours to retrieve to _datetime. * @return a new date in the syntax yyyymmddhhmm. */ string getTime(string _datetime, int _hours) { time_t rawtime; struct tm * timeinfo; /* get current timeinfo and modify it to a structure tm */ time (&rawtime); timeinfo = gmtime (&rawtime); timeinfo->tm_year = atoi(_datetime.substr(0,4).c_str()) - 1900; timeinfo->tm_mon = atoi(_datetime.substr(4,2).c_str()) - 1; timeinfo->tm_mday = atoi(_datetime.substr(6,2).c_str()); timeinfo->tm_hour = atoi(_datetime.substr(8,2).c_str()) + _hours; timeinfo->tm_min = atoi(_datetime.substr(10,2).c_str()); timeinfo->tm_sec = 0; rawtime = timegm (timeinfo); timeinfo = gmtime (&rawtime); /* La classe MDate est développé par mes soins et sa fonction toString() renvoie la date au format souhaité */ MDate _date; _date.clear(); _date.setYear(timeinfo->tm_year + 1900); _date.setMonth(timeinfo->tm_mon + 1); _date.setDay(timeinfo->tm_mday); _date.setHour(timeinfo->tm_hour); _date.setMinute(timeinfo->tm_min); return _date.toString(); }
Je voulais donc savoir si il pouvait exister un moyen d'avoir la même fonction que je pourrait compiler aussi bien sous Linux que sous WIN32.
Merci par avance.
Partager