IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

<time.h> code fonctionnant sous WIN32 et Linux


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut <time.h> code fonctionnant sous WIN32 et Linux
    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:
    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();
    }
    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).
    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:
    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();
    }
    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++.

    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.
    C'est au pied du mur... que l'on voit le mieux le mur!!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Pour ceux que ça pourrait intéresser...
    Voilà comment j'ai résolu mon problème:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    /**
     * @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 PStorage::getTime(string _datetime, int _hours)
    {
      time_t rawtime;
      struct tm * timeinfo;
      //int year, month, day, hours, minutes;
     
      cout << "DateTime given: " << _datetime << endl;
     
      /* get current timeinfo and modify it to _datetime */
      time (&rawtime);
     
    #ifdef WIN32
      timeinfo = localtime (&rawtime);
    #else
      timeinfo = gmtime (&rawtime);
    #endif
     
      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;
      timeinfo->tm_isdst = 0;
     
      /* call mktime: timeinfo.tm_wday will be set */
    #ifdef WIN32
    	rawtime = mktime (timeinfo);
        timeinfo = localtime (&rawtime);
    #else
    	rawtime = timegm (timeinfo);
    	timeinfo = gmtime (&rawtime);
    #endif
     
      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);
     
      cout << "DateTime sent: " << _date.toString() << endl;
     
      return _date.toString();
    }
    Ce n'est pas exactement ce que je cherchais, mais faute de mieux, ça me convient tout à fait.
    C'est au pied du mur... que l'on voit le mieux le mur!!

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Merci pour ce retour positif. J'étais en train de chercher quelque chose dans le genre, je n'aurais pas fait mieux
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Code fonctionnant sous IE et Firefox mais pas sous Chrome
    Par Hanoni dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/03/2010, 16h43
  2. code fonctionnant sous IE mais pas firefox ni chrome
    Par Hotei dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 04/03/2010, 16h39
  3. [XMLHttpRequest] Pourquoi ce code fonctionne sous IE8 et pas sur Firexox 3.0.11
    Par homeostasie dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 23/07/2009, 14h50
  4. [JMF] Code fonctionnant sous Linux mais pas sous XP
    Par Monsieur_Max dans le forum Multimédia
    Réponses: 4
    Dernier message: 25/05/2006, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo