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 :

aide fonction strftime.


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 41
    Points
    41
    Par défaut aide fonction strftime.
    Bonjour, je m'occupe d'une partie des conversions de date pour mon programme et j'ai un petit problème...
    Le but est d'ici de prendre une date : 01/01/2010 par exemple, de la convertir en timestamp puis de la reconvertir en date.

    Voici mon code :
    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
     
    int civile_date_to_ts(char * date){
    	int timestamp = 0;
    	struct tm date_tm;
    	char tmp[5];
     
    	tmp[0] = date[0];
    	tmp[1] = date[1];
    	tmp[2] = '\0';
    	date_tm.tm_mday = atoi(tmp);   // jour
     
    	tmp[0] = date[3];
    	tmp[1] = date[4];
    	tmp[2] = '\0';
        date_tm.tm_mon  = atoi(tmp) - 1;   // mois (-1 car commence a 0)
     
    	tmp[0] = date[6];
    	tmp[1] = date[7];
    	tmp[2] = date[8];
    	tmp[3] = date[9];
    	tmp[4] = '\0';
        date_tm.tm_year = atoi(tmp) - 1900; // annee
     
        date_tm.tm_hour = 0;   // heure
        date_tm.tm_min  = 0;   // minute
        date_tm.tm_sec  = 0;   // seconde
     
    	return mktime(&date_tm);
    }
     
    char * ts_to_civile_date_time(int timestamp, char * date){
        time_t t = timestamp;
        strftime(date, 20, "%d/%m/%Y %H:%M:%S", localtime(&t));
    	return date;
    }
     
    void main(){
    int timestamp;
    timestamp = civile_date_to_ts("01/01/2010");
    printf("%d\n", timestamp);
    printf("%s\n\n", ts_to_civile_date_time(timestamp_file, temp));
    }
    Il me semble que c'est à peu près correct et ça l'est pour certaines valeurs de date...
    A priori, les timestamp obtenus sont corrects car comparés avec des outils en ligne ( http://www.timestamp.fr/ ). Par contre, les date obtenues a partir des timestamp sont parfois mauvaises. Voici quelques exemples :
    01/01/2010 => 1262300400 => 31/12/2009 23:00
    01/02/2010 => 1264978800 => 31/01/2010 23:00
    01/03/2010 => 1267398000 => 28/02/2010 23:00
    01/04/2010 => 1270076400 => 01/04/2010 00:00
    01/05/2010 => 1272668400 => 01/05/2010 00:00
    01/06/2010 => 1275346800 => 01/06/2010 00:00
    01/07/2010 => 1277938800 => 01/07/2010 00:00
    01/08/2010 => 1280617200 => 01/08/2010 00:00
    01/09/2010 => 1283295600 => 01/09/2010 00:00
    01/10/2010 => 1285887600 => 01/10/2010 00:00
    01/11/2010 => 1288566000 => 31/10/2010 23:00
    01/12/2010 => 1291158000 => 30/11/2010 23:00

    J'ai d'autre part, fait des tests sur tous les jours du mois de mars et de juillet, sur le premier l'erreur est constante et sur l'autre il n'y a pas d'erreur.
    J'ai aussi testé toutes les années entre 2005 et 2015 sur ces deux mois et j'ai la même constatation que précédemment.

    Il semblerait donc que cette erreur soit liée au mois de l'année...
    Actuellement, je n'ai aucune idée du pourquoi ça fait ça (j'ai consulté de la doc et un peu recherché sur internet mais pas de pistes...).

    Si vous avez une idée sur le comment du pourquoi de ce comportement étrange ça m'intéresse, et encore plus si ça permet de le corriger

    Merci en tous cas

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est une question heure d'été/heure d'hiver.

    Il y a déjà eu des post sur ce sujet. Fait une recherche sur le forum.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 41
    Points
    41
    Par défaut
    Salut, merci beaucoup diogene.

    J'avoue que je n'ai pas encore le réflexe de faire des recherches sur le fofo (honte a moi). Toutefois avec strftime je n'ai pas trouvé grand chose, j'ai du mettre "strftime été hiver".

    En tous cas merci beaucoup, le problème est résolu.

    Solution retenue :
    mettre l'attribut tm_isdst à -1 pour ne pas prendre en compte le changement d'heure été hiver.
    Solution trouvée ici : http://man.developpez.com/man3/ctime.3.php

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

Discussions similaires

  1. aide fonction tri heapsort (création du tas)
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 24/11/2009, 00h27
  2. [aide fonction popup.close() ]
    Par viny dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/07/2006, 16h41
  3. Aide fonction getopt
    Par makohsarah dans le forum C
    Réponses: 12
    Dernier message: 12/06/2006, 16h02
  4. aide fonction math[racine,cos(),sin(),..]VB6
    Par am.adnane dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/12/2005, 18h40
  5. besoin d'aide fonction avec fichier (debutant)
    Par boby61 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/03/2005, 11h22

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