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 :

format DATETIME en C


Sujet :

C

  1. #1
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut format DATETIME en C
    Bonjour et bonne année à tous !!

    Je dois récupérer une variable de type DATETIME (format mysql : AAAA-MM-JJ HH:MM:SS ) dans mon programme en C et je dois en suite réaliser une soustraction entre cette date et la date courante...

    Mon premier problème :
    - Comment récupérer cette date dans mon programme en C ? Quel type ? dois-je créer une strcture de ce format ? Comment faire...

    Ensuite :
    pour la soustraction je peux utiliser la méthode difftime? elle doit prendre en paramètre la date récupérée de ma base de donnée et la soustraire à celle d'aujourd'hui...

    Merci beaucoup de votre aide...

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Je dois récupérer une variable de type DATETIME (format mysql : AAAA-MM-JJ HH:MM:SS ) dans mon programme en C et je dois en suite réaliser une soustraction entre cette date et la date courante...

    Mon premier problème :
    - Comment récupérer cette date dans mon programme en C ? Quel type ? dois-je créer une strcture de ce format ? Comment faire...
    C'est du texte ? Il faut découper (strtok(), strtok_r()), convertir en numérique (strtol()), mettre dans une structure standard (struct tm), 'normaliser' (mktime())...
    pour la soustraction je peux utiliser la méthode difftime? elle doit prendre en paramètre la date récupérée de ma base de donnée et la soustraire à celle d'aujourd'hui...
    Pas de 'méthodes' en C, mais des fonctions... Que dit la doc ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    Mon premier problème :
    - Comment récupérer cette date dans mon programme en C ? Quel type ? dois-je créer une strcture de ce format ? Comment faire...
    Tout d'abord comment ton programme reçoit-elle la date. Si c'est sous forme de chaîne, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(date, "%s-%s-%s %s:%s:%s", annee, mois, jour, h, m, s);
    où évidemment annee, mois, jour, h, m et s sont des tableaux de char assez larges pour leur utilisation. Tu les convertis ensuite en int (atoi par exemple) puis tu mets ces infos dans une structure de type struct tm, après tu appelles mktime le convertir en format arithmétique (time_t) puis tu peux bien sûr appeler difftime pour faire la soustraction entre deux dates. La fonction time retourne la date (date et heure) courante. N'oublie pas d'inclure time.h.

    [EDIT]
    ben on peut immédiatement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(date, "%d-%d-%d %d:%d:%d", &annee, &mois, &jour, &h, &m, &s);
    en fait ... où annee, mois, jour, h, m et s sont des variables de type int
    [/EDIT]

  4. #4
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    Merci.

    En fait, je récupère cette date et heure par une requete dans ma base de donnée mysql. et ensuite le résultat de ma requete est mit dans une structure.

    Donc si j'ai bien compris :

    ma strcuture sera la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct livraison
    {
        int insee;
        char  nomC[30];
        double latitudeCollecte;
        double longitudeCollecte;
        char  nomL[30];   
        double latitudeLivraison;
        double longitudeLivraison;
        int cp;   
        int id_plateforme;
        struct tm *datetime;
    }s_livraison;
    et voici le code qui reçoit la variable à partir de la requete SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* Tant qu'il y a un resultat */
    while ((row = mysql_fetch_row(result))) {
     
    // Ici je dois travailler avec la variable row[10] : champs 10 de ma table
    // et je dois parser pour mettre ca dans les champs correspondant //(datetime->tm_mday,datetime->tm_mon ....)
     
    sscanf(row[10], "%d-%d-%d %d:%d:%d", &datetime->tm_year, &datetime->tm_mon, &datetime->tm_mday, &h,&m, &s);
    Est ce bien cela ?
    Merci

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Melem Voir le message
    [EDIT]
    ben peut immédiatement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(date, "%d-%d-%d %d:%d:%d", annee, mois, jour, h, m, s);
    en fait ... où annee, mois, jour, h, m et s sont des variables de type int
    [/EDIT]
    Il faut quand même se souvenir que "%d" avec *scanf() attend des adresses...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Est ce bien cela ?
    Non.

    http://www.developpez.net/forums/sho...51&postcount=5
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il faut quand même se souvenir que "%d" avec *scanf() attend des adresses...
    Merci. J'édite ça tout de suite.

  8. #8
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par nicodn02
    Merci.

    En fait, je récupère cette date et heure par une requete dans ma base de donnée mysql. et ensuite le résultat de ma requete est mit dans une structure.

    Donc si j'ai bien compris :

    ma strcuture sera la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct livraison
    {
        int insee;
        char  nomC[30];
        double latitudeCollecte;
        double longitudeCollecte;
        char  nomL[30];   
        double latitudeLivraison;
        double longitudeLivraison;
        int cp;   
        int id_plateforme;
        struct tm *datetime;
    }s_livraison;
    et voici le code qui reçoit la variable à partir de la requete SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Tant qu'il y a un resultat */
    while ((row = mysql_fetch_row(result))) {
     
    // Ici je dois travailler avec la variable row[10] : champs 10 de ma table
    // et je dois parser pour mettre ca dans les champs correspondant //(datetime->tm_mday,datetime->tm_mon ....)
     
    sscanf(row[10], "%d-%d-%d %d:%d:%d", datetime->tm_year, datetime->tm_mon, datetime->tm_mday, h, m, s);
    Est ce bien cela ?
    Merci
    Tu aurais quand même pu remarqué qu'il y avait une (grosse) erreur dans le sscanf. C'est pas bien de copier bêtement. Et dernière chose, lis bien la doc de mktime avant de l'utiliser.

  9. #9
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    Merci beaucoup.
    Je vais essayer

  10. #10
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    J'ai réussi à bien récupérer mes dates de mysql.

    Mais j'ai un soucis avec le calcul du temps entre deux dates...
    Dans ma démarche, j'ai d'abord récupérer la date et l'heure actuelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* Date et Heure actuelle */
    struct tm t;
    time_t today,tps;
    time(&today);
    printf("Date et heure actuelle : %s\n", ctime(&today));
    system("pause");
    Ensuite pour chaque élement de mon tableau, j'appelle la focntion qui permet de calculer le temps entre ces deux dates.

    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
     
    struct tm t;
    time_t today,tps;
     
    /* MAJ des priorites */
         for(int i=0;i<*nbLivraisonTotales;i++){
     
                 // pour chaque livraisons calcul de la priorite  
                 t.tm_year = (tabLivraisonsTotales+i)->datetime.tm_year - 1900;
                 t.tm_mon  = (tabLivraisonsTotales+i)->datetime.tm_mon-1;
                 t.tm_mday = (tabLivraisonsTotales+i)->datetime.tm_mday;
                 t.tm_hour = (tabLivraisonsTotales+i)->datetime.tm_hour;
                 t.tm_min  = (tabLivraisonsTotales+i)->datetime.tm_min;
                 t.tm_sec  = (tabLivraisonsTotales+i)->datetime.tm_sec;       
                 tps = mktime(&t);
     
                 printf("Date et heure au plus tard : %s \n", ctime(&tps));
                 (tabLivraisonsTotales+i)->priorite=set_priorite(tps,today); 
                 printf("priorite est de %d \n",(tabLivraisonsTotales+i)->priorite);
    et voici le code de la fonction set_priorite
    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
     
    // MAJ des priorites
    int set_priorite(time_t fin, time_t depart){
     
        time_t diff = difftime(fin,depart);
     
        struct tm tm_diff = *gmtime (&diff);
     
        printf ("Plus que %d heures avant date / heure actuelle \n", tm_diff.tm_hour);
        system("pause");
     
        if (tm_diff.tm_hour <= 6)
           return 4;
     
        if (tm_diff.tm_hour <= 12)
           return 3;
     
        if (tm_diff.tm_hour <= 24)
           return 2;
     
        if (tm_diff.tm_hour <= 48)
           return 1;         
    }
    Voici mes soucis :
    - Pourquoi lors de mon premier appel à la fonction set_priorite, l'heure que je passe en paramètre est decallé d'une heure ( exemple : dans ma BD j'ai 15:50:23 et lors de l'appel je lui passe 14:50:23 ); Ce problème est présent uniquement lors du premeir appel car pour les autres heures je n'ai pas de soucis.

    - Mon second problème est qu'il faut que je transforme la difference en heure tout court c'est à dire que si ce n'est pas la même date mon test ne fonctionne pas; Jamais je retournerais 1 . Peux t on transformer cette date diff en une simple variable contenant des heures ( par exemple 1 jour et 2 heures equivaut à 26heures...).
    J'espere avoir été clair... Je me penche actuellement sur le deuxième problème mais je ne vois pas de solution ni d'ou viendrait le problème pour le premier soucis.

    Merci d'avance

  11. #11
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    Voila la reponse aux deuxème soucis

    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
     
    // même jour    
     if (tm_diff.tm_mon == 0 && tm_diff.tm_mday == 1){   
     
        if (tm_diff.tm_hour <= 6)
           return 4;
     
        if (tm_diff.tm_hour <= 12)
           return 3;
     
        if (tm_diff.tm_hour <= 24)
           return 2;
     
     }else
     // different jours
     return 1;
    J'ai ajouté un test sur le jours et le mois.. et jvais surement ajouter celle sur l'année..

    Il me reste plus que le premier soucis..merci de votre aide

  12. #12
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    T'avais pas pensé que c'est peut-être du au décalage horaire ?
    Citation Envoyé par nicodn02
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct tm tm_diff = *gmtime (&diff);
    Pourquoi tu récupères l'heure en Temps Universel? Utilise plutôt localtime.

  13. #13
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Personnellement je ferais faire le travail à mysql directement dans la requete, si c'est possible

  14. #14
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    Je viens de tester avec *localtime.. toujours le même problème! Mais le plus drôle c'est que cela me fait ça uniquement pour le premier traité.. Et pour les autres plus de soucis...
    J'ai poussé plus loin et j'ai fais des affichages de test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                 // pour chaque livraisons calcul de la priorite  
                 t.tm_year = (tabLivraisonsTotales+i)->datetime.tm_year - 1900;
                 t.tm_mon  = (tabLivraisonsTotales+i)->datetime.tm_mon-1;
                 t.tm_mday = (tabLivraisonsTotales+i)->datetime.tm_mday;
                 t.tm_min  = (tabLivraisonsTotales+i)->datetime.tm_min;
                 t.tm_sec  = (tabLivraisonsTotales+i)->datetime.tm_sec; 
                 t.tm_hour = (tabLivraisonsTotales+i)->datetime.tm_hour;      
                 tps = mktime(&t);
                 printf("%d \n",t.tm_hour);
                 printf("%d \n",(tabLivraisonsTotales+i)->datetime.tm_hour);
    Et le résultat est celui-ci :
    - le premier printf donne 22 heure par exemple
    - le second printf donne bien le chiffre de ma BD c'est à dire 23 heures...

    Et ensuite pour les prochaines dates je n'ais plus ce problème...

    Concernant de le faire par mysql tu entends quoi? de faire la soustraction entre la date et heure courrante et la date et l'heure de la livraison de ma BD ?

  15. #15
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Concernant de le faire par mysql tu entends quoi? de faire la soustraction entre la date et heure courrante et la date et l'heure de la livraison de ma BD ?
    Oui
    http://dev.mysql.com/doc/refman/5.0/...functions.html

  16. #16
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    Je vais me pencher dessus alors.. Merci

  17. #17
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    J'ai réussi.. Nickel
    Merci encore

    Pour ceux que ca intéresse voici la requête associée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (!mysql_query(mysql, "SELECT *,TIME_TO_SEC(TIMEDIFF(`dateheure`,SYSDATE())) FROM livraison")){
          printf("Requete effectuee ! \n");

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

Discussions similaires

  1. Soustraire 2 heures d'un format datetime ?
    Par innova dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2007, 14h29
  2. [MySQL] comment rechercher une date au format datetime avec une date au format date
    Par Menoly dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/06/2007, 10h14
  3. DTS importation de données texte - probleme format datetime
    Par kungouf dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 25/10/2006, 17h00
  4. [Oracle] Retour de date complète (format DATETIME)
    Par AntaresJon dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/04/2006, 17h57
  5. pb format datetime avec mysql
    Par ms91fr dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/12/2004, 14h12

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