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

Langage C++ Discussion :

problème avec mktime


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut problème avec mktime
    bonjour,

    j'ai un soucis avec la fonction mktime de la bibliothèque ctime: je voudrais convertir une durée en heures, minutes, secondes en une donnée de type time_t. Petit programme de test:
    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
    #include <iostream>     // std::cin, std::cout#include <iomanip>      // std::get_time
    #include <ctime>        // struct std::tm
     
     
    int main()
    {
    	struct tm* tm;
    	time_t temps = 0;
    	tm = gmtime(&temps); // 01-01-1970 00:00:00
    	tm->tm_hour = 1;
    	tm->tm_min = 18;       // 01-01-1970 01:18:00
    	temps = mktime(tm);
    	std::cout << temps <<std:: endl;
    	return 0;
    }
    et l'affichage donne 1080 alors que je m'attendais à 3600 + 18*60 = 4680. L'heure n'a donc pas été prise en compte.
    Pourtant la structure tm me semble correcte à chaque fois (programme testé sous gcc et msvc2013).

    Pouvez-vous m'indiquer quelle erreur d'interprétation j'ai pu faire?
    Merci.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Le mot clef est timezone.
    Avec strftime et "%z" comme format, l'UTC doit être de +0100, d'où la différence d'une heure.

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    Merci pour ta réponse.

    J'avais bien pensé à la localisation: à l'origine, j'appelais la fonction localtime(&temps) à la ligne 9, mais les valeurs étaient identiques dans la structure et par conséquent le résultat final aussi.

    De plus, mktime devant retourner une valeur de type time_t correspondant au temps local, cette valeur aurait dû être plus élevée de 2 heure par rapport au gmtime.

    Bref, que dois-je modifier dans mon programme pour obtenir la bonne valeur?

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Le problème n'est pas gmtime, mais mktime qui dépend du timezone. Il faut un mktime sans tz.
    timegm pour Linux: http://linux.die.net/man/3/timegm
    _mkgmtime pour Windows: https://msdn.microsoft.com/en-us/library/2093ets1.aspx

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    Merci, je viens (enfin) de comprendre. le type time_t stocke toujours l'heure par rapport à l'UTC.

    Problème résolu donc

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

Discussions similaires

  1. Problème jour semaine avec mktime
    Par dasycarpum dans le forum C++
    Réponses: 2
    Dernier message: 07/04/2011, 15h18
  2. Réponses: 1
    Dernier message: 25/05/2007, 22h31
  3. [Dates] problème avec date et mktime
    Par gloubi dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2007, 17h59
  4. Problème avec la fonction mktime
    Par major2 dans le forum Langage
    Réponses: 1
    Dernier message: 19/12/2005, 10h50
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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