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 une date en time_t


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut Convertir une date en time_t
    Bonjour,
    je cherche à faire une fonction qui prend comme argument une date de la forme "Dec 18 00:00:20" et qui renvoie le time_t correspondant. Ma fonction renvoie 1.252.299.098 alors qu'il semblerait que la bonne réponse soit 1.261.094.420.
    Pouvez-vous m'aider à voir ce qui ne va pas?
    Merci d'avance.

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
     
    time_t string_to_time_t(char *s)
    {
            time_t rawtime;
            struct tm * timeinfo;
            char month_s[3],day_s[2],hour_s[2],minute_s[2],second_s[2];
            int month,day,hour,minute,second;
            char *p=s;
     
            strncpy(month_s,p,3); p+=4;
            strncpy(day_s,p,2); p+=3;
            strncpy(hour_s,p,2); p+=3;
            strncpy(minute_s,p,2); p+=3;
            strncpy(second_s,p,2);
     
            char * month_names[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
            int i=0;
            while( !(strcmp(month_s,month_names[i])) )
                    i++;
            month=i;
           day=atoi(day_s);
            hour=atoi(hour_s);
            minute=atoi(minute_s);
            second=atoi(second_s);
     
            time (&rawtime);
            timeinfo=localtime(&rawtime);
            timeinfo->tm_mon=month;
            timeinfo->tm_mday=day;
            timeinfo->tm_hour=hour;
            timeinfo->tm_min=minute;
            timeinfo->tm_sec=second;
            return mktime(timeinfo);
    }
     
    int main(int argc, char **argv)
    {
            printf("temps %lu\n",(unsigned long)string_to_time_t("Dec 18 00:00:20"));
            return 0;
    }

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Déjà tu es tombé dans une erreur classique : en C les chaînes de caractères possèdent toujours un caractère de fin, le '\0', à la fin. Ce qui signifie que la chaîne "Dec" contient 4 caractères et non 3. Il faut donc modifier en conséquence la taille de tes tableaux.

    Sinon, tu aurais pu également extraire les données plus facilement avec sscanf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(s, "%3s %d %d:%d:%d", month, &day, &hour, &minute, &second);
    Puisqu'on tente d'extraire 5 informations différentes (%3s et les 4 %d), sscanf devrait retourner 5 pour indiquer un succès. Une valeur différente indique une erreur. La chaîne s est par exemple dans un mauvais format ...

    Ensuite, ton algorithme de recherche de l'indice du mois est faux. Il faut enlever le ! devant strcmp.

    Ma fonction renvoie 1.252.299.098 alors qu'il semblerait que la bonne réponse soit 1.261.094.420.
    Absolument pas. Déjà la plupart des compilateurs utilisent le 1er janvier 1970, 00:00:00 comme date de référence donc, le 18 Dec 2009, 00:00:00, ce sont plutôt 1 261 081 820 secondes qui se sont écoulées.

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Merci beaucoup pour la réponse.

    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
    time_t string_to_time_t(char *s)
    {
            time_t rawtime;
            struct tm * timeinfo;
            char month_s[4] ;
            int month,day,hour,minute,second;
            sscanf(s, "%3s %d %d:%d:%d", month_s, &day, &hour, &minute, &second);     
     
            char * month_names[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
            int i=0;
            while( strcmp(month_s,month_names[i]) != 0  )
                    i++;
            month=i;
     
            time (&rawtime);
            timeinfo=localtime(&rawtime);
            timeinfo->tm_mon=month;
            timeinfo->tm_mday=day;
            timeinfo->tm_hour=hour;
            timeinfo->tm_min=minute;
            timeinfo->tm_sec=second;
            return mktime(timeinfo);
    }
     
    int main(int argc, char **argv)
    {
            printf("temps %lu\n",(unsigned long)string_to_time_t("Dec 18 00:00:20"));
            return 0;
    }

    c'est mieux là ? (à savoir, y a-t-il des modifications/améliorations à apporter, et auriez-vous fait différemment?)

    ps: pour la donnée réelle de la date proposée en time_t, j'ai utilisé un java présent sur le net, qui était peut-être mal programmé, ou alors j'ai fait une faute de frappe. Mais je savais que mon programme était faux car en faisant l'opération inverse je ne retombe plus sur la même date.

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    C'est bon. Je ne vois pas ce qu'on pourrait encore changer à part améliorer la sécurité, notamment tester le retour de scanf et arrêter la boucle dès que i tente d'aller au delà du tableau.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 29/06/2005, 10h22
  2. Convertir une date lunaire
    Par djeckelle dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 03/12/2004, 14h06
  3. []Comment convertir une date GMT en date vb ?
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/08/2004, 16h01
  4. Convertir une date au format excel en datetime SQL server
    Par ALLB dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/07/2004, 11h28
  5. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52

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