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 :

Convertir un timestamp unix en time_t ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 94
    Par défaut Convertir un timestamp unix en time_t ?
    Bonjour à toutes et à tous,

    Je cherche depuis plusieurs jours sur mon temps libre comment convertir un timestamp unix en type time_t.
    La question semble être un classique et j'ai trouvé plein de résultats sur mon ami le moteur de recherche, notamment une conversation intéressante sur ce thread.

    Cependant, après moults essais, je ne trouve pas comment procéder. Je ne tombe jamais sur la date attendue. En fait je retrouve bien l'horaire et l'horaire exact mais avec 24h (très précisément!) de décalage...

    Voici mon plus récent essai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int unix_server_time = ...; //une valeur retournée par le serveur distant
    struct tm timeinfo = {0};
    timeinfo.tm_year = 70;
    timeinfo.tm_sec = (signed long) unix_server_time;
    now = mktime(&timeinfo);
    Le unix_server_time est de type unsigned int (que j'ai changé en signed long plutôt que de caster à la volée, mais le résultat est le même) et m'est retourné par un serveur après requête, j'ai vérifié par un convertisseur en ligne et ce timestamp est correct. Le thread mentionné indique bien que tm_sec peut gérer des valeurs >> 60 donc ca devrait fonctionner, mais il me manque encore 1 journée... quelqu'un a t'il une idée d'ou vient de cette différence?

    Merci!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Si cela se trouve, le serveur avance (ou retarde) tout simplement d'un jour...

    si le décalage n'avait été que de "quelques heures" (dans un sens ou dans un autre), j'aurais en priorité pensé au fuseau horaire du serveur, mais là... je ne vois guère d'autre possibilité
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Le timestamp commence à partir du 01/01/1970.
    Donc, j'imagine que 0 seconde donne un 01/01/1970.

    Vérifie donc le résultat donné pour unix_server_time = 0;. Je suis prête à parier que tu obtiens un 0/01/1970
    Tu peux aussi tester avec 86400 secondes (le nombre de secondes dans une journée)

  4. #4
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 94
    Par défaut
    Merci à tous pour vos réponse.
    Pour faire écho à ternel, en faisant on obtient un timestamp qui correspond à Wed, 31 Dec 1969 00:00:00 GMT. Soit bien 24h de retard. Nous sommes donc à une constante prêt et il me suffit de rajouter 86400 et hop problème réglé!
    Meri beaucoup pour cette aide!

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Ce code simple fonctionne et retourne ce que j'attends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    time_t time = 0;
    	tm t;
    	gmtime_s(&t, &time);
    	char buffer[64+1]{ 0 };
    	asctime_s(buffer, 64, &t);
    	std::cout << buffer << std::endl;
    	t.tm_sec = 1;
    	asctime_s(buffer, 64, &t);
    	std::cout << buffer << std::endl;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thu Jan  1 00:00:00 1970
    Thu Jan  1 00:00:01 1970
    Je suspecte plutôt que tu as un décallage horaire quelque part.
    Ou bien que ta machine affiche le "mauvais" jour selon une configuration : 0h00 est vraiment spécial, c'est autant la dernière seconde du jour précédent que la première du nouveau jour. Si tu veux être sûr, affiche 0h00:01, lui c'est le 01/01/1970 sans équivoque.

    Au passage, le type time_t sert à ce genre de conversion et est plus sûr qu'une manipulation de tm cavalière.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Choix du format de date timestamp Mysql ou timestamp Unix
    Par audreyc dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/04/2009, 07h20
  2. [SQL2K] Problème pour convertir un timestamp en datetime !!
    Par MeHo_ dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/03/2008, 11h02
  3. Comment convertir un timestamp négatif en date ?
    Par Sergejack dans le forum Requêtes
    Réponses: 5
    Dernier message: 05/11/2007, 17h02
  4. Formater une date via un timestamp UNIX et un modèle modifiable
    Par Aldéhir dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 7
    Dernier message: 11/09/2007, 16h43
  5. [8.5] convertir un timestamp
    Par rissorg dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 22/05/2007, 13h43

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