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 :

Calcul sur les dates et conversions


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut Calcul sur les dates et conversions
    bonjour,
    je fais une appli qui va gérer des délais, exemple tu n'as pas fait la vaisselle depuis 28 jours ou depuis 1 mois 3 jours et 2 heures
    je coince sur les calculs, j'ai essayé difftime le format de mes variables ne lui convient pas (structures tm)
    voici mon code de début...
    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
     
    #include <stdio.h>
    #include <time.h>
     
    int main(void)
    {
        time_t secondes;
        struct tm ancienMoment;
    	struct tm actuelMoment;
    	struct tm duree;
     
        time(&secondes);
        actuelMoment =*gmtime(&secondes);
    	//ancienMoment =*localtime(&secondes);
    	ancienMoment.tm_hour=10;
    	ancienMoment.tm_mday=10;
    	ancienMoment.tm_min=5;
    	ancienMoment.tm_sec=0;
    	ancienMoment.tm_mon=8;
    	ancienMoment.tm_year=2013;
        printf("%02d/%02d/%04d ; %02d:%02d:%02d\n", actuelMoment.tm_mday+1, actuelMoment.tm_mon+1,actuelMoment.tm_year+1900, actuelMoment.tm_hour, actuelMoment.tm_min, actuelMoment.tm_sec);
        printf("%02d/%02d ; %02d:%02d:%02d\n", ancienMoment.tm_mday+1, ancienMoment.tm_mon+1, ancienMoment.tm_hour, ancienMoment.tm_min, ancienMoment.tm_sec);
     
    		//printf("Tu n'as pas fait la vaisselle depuis %f secondes.", difftime(ancienMoment, actuelMoment)); ca ne marche pas et les 2 variables ancienMoment, actuelMomentne sont pas reconnues
     
    	return 0;
     
    }
    d'autre part j'aimerais convertir dans les différents formats permettant de simplifier les calculs puis remettre en structure tm... c'est idiot ? j'ai raison ?
    merci de votre aide
    le papy prog qui fait joujou à l'ordi
    Amicalement

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Salut

    La fonction difftime() prend en paramètres des time_t (c'est à dire des dates converties en secondes) et non une struct tm.

    En effet, Unix gère ses dates en secondes à partir du 1/1/1970 00h00. C'est à dire que le 1/1/1970 01h00 est simplement stocké comme "3600". Le 2/1/1970 00h00 est stocké comme 86400 et le 2/1/1970 01h00 est stocké sous la valeur 90000. Et etc etc etc jusqu'en 2038 où la valeur (trop grande pour tenir sur un long) repassera à 0.

    Donc c'est plus facile pour calculer des écarts (et à l'époque du bug de l'an 2000 où tous les admin zindows courraient de partout en criant "on va tous mourir" les admin Linux riaient à gorge déployée) mais tu es obligé de passer par des fonctions de conversion pour convertir un time_t en struct tm et inversement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    La fonction difftime() prend en paramètre deux variables de type time_t et non struct tm comme le sont ancienMoment et actuelMoment que tu tentes de passer.

    Si l'on regarde attentivement la documentation de la fonction, on peut apercevoir dans l'exemple l'utilisation de la fonction mktime pour justement effectuer la conversion d'un type à l'autre

    Vient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    difftime( mktime(&ancienMoment), mktime(&actuelMoment) )
    Remarques :
    • Tu l'as bien ajouté dans le printf, mais pas retranché par avant : ancienMoment.tm_year=2013-1900;
    • Le mois est dans l'intervalle [0, 11], mais le jour dans [1, 31], donc ajoute 1 seulement au mois

    PS : bon courage lorsque tu feras la vaisselle !

  4. #4
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci à tous les 2
    je ne savais pas que je pouvais insérer mktime dans les paramètres de difftime.
    c'est tout bête et ça marche
    merci en plus Jérome pour tes autres corrections pertinentes.

    bon mon petit bout de code de début de mon appli marche, je mets le sujet résolu... mais je reviendrais certainement vers vous dans pas longtemps pour la suite.

    merci encore car je ne suis pas capable d'apprendre tout seul avec des manuels de référence et des cours de base, alors c'est grave à vos aides point par point que j'avance dans la connaissance et la compréhension des fonctions et autres joies de l'informatique.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luckyalan Voir le message
    je ne savais pas que je pouvais insérer mktime dans les paramètres de difftime.
    Ben oui, tout retour de fonction peut-être utilisé comme paramètre d'une autre fonction si ce retour est du même type que le paramètre attendu...

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int carre(int n)
    {
        return n*n;
    }
     
    printf("Le carré du carré de 4 est %d\n", carre(carre(4)));
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    bonjour
    merci sve@r pour l'nfo,
    j'avais marqué résolu, mais je reviens vers vous car je n'arrive pas à transformer le résultat difftime en structure tm,
    j'ai essayé avec mktime mais conversion impossible
    je suis passé par un "double", mais conversion double en tm impossible, je sèche
    merci de votre aide
    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
     
    #include <stdio.h>
    #include <time.h>
     
    int main(void)
    {
        time_t secondes;
    	time_t duree_t;
        struct tm ancienMoment;
    	struct tm actuelMoment;
    	struct tm duree;
    	//double duree_t;
        time(&secondes);
        actuelMoment =*gmtime(&secondes);
    	//ancienMoment =*localtime(&secondes);
    	ancienMoment.tm_hour=10;
    	ancienMoment.tm_mday=10;
    	ancienMoment.tm_min=5;
    	ancienMoment.tm_sec=0;
    	ancienMoment.tm_mon=12;
    	ancienMoment.tm_year=2013-1900;
        printf("%02d/%02d/%04d ; %02d:%02d:%02d\n", actuelMoment.tm_mday, actuelMoment.tm_mon+1,actuelMoment.tm_year+1900, actuelMoment.tm_hour, actuelMoment.tm_min, actuelMoment.tm_sec);
        printf("%02d/%02d ; %02d:%02d:%02d\n", ancienMoment.tm_mday, ancienMoment.tm_mon+1, ancienMoment.tm_hour, ancienMoment.tm_min, ancienMoment.tm_sec);
     
    	printf("Pas fait la vaisselle pendant %f secondes.\n", difftime( mktime(&actuelMoment), mktime(&ancienMoment) ));
    	duree_t = difftime( mktime(&actuelMoment), mktime(&ancienMoment) );
    	printf("Pas fait la vaisselle pendant %f secondes.", duree_t);
    	duree = mktime(&duree_t);
    	printf("Pas fait la vaisselle pendant %f secondes.", &duree.tm_sec);
    	getchar(); 
    	//system("PAUSE");
    	return 0;
     
    }

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luckyalan Voir le message
    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
    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        time_t secondes;
    	time_t duree_t;
        struct tm ancienMoment;
    	struct tm actuelMoment;
    	struct tm duree;
    	//double duree_t;
        time(&secondes);
        actuelMoment =*gmtime(&secondes);
    	//ancienMoment =*localtime(&secondes);
    	ancienMoment.tm_hour=10;
    	ancienMoment.tm_mday=10;
    	ancienMoment.tm_min=5;
    	ancienMoment.tm_sec=0;
    	ancienMoment.tm_mon=12;
    	ancienMoment.tm_year=2013-1900;
        printf("%02d/%02d/%04d ; %02d:%02d:%02d\n", actuelMoment.tm_mday, actuelMoment.tm_mon+1,actuelMoment.tm_year+1900, actuelMoment.tm_hour, actuelMoment.tm_min, actuelMoment.tm_sec);
        printf("%02d/%02d ; %02d:%02d:%02d\n", ancienMoment.tm_mday, ancienMoment.tm_mon+1, ancienMoment.tm_hour, ancienMoment.tm_min, ancienMoment.tm_sec);
    
    	printf("Pas fait la vaisselle pendant %f secondes.\n", difftime( mktime(&actuelMoment), mktime(&ancienMoment) ));
    	duree_t = difftime( mktime(&actuelMoment), mktime(&ancienMoment) );
    	printf("Pas fait la vaisselle pendant %f secondes.", duree_t);
    	duree = mktime(&duree_t);
    	printf("Pas fait la vaisselle pendant %f secondes.", &duree.tm_sec);
    	getchar(); 
    	//system("PAUSE");
    	return 0;
    
    }
    Ligne 28: mktime prend en paramètre un struct tm. Toi tu lui passes un time_t... (en rouge)

    Tu pourrais essayer ceci duree = *gmtime(&duree_t); mais ça te traduira un écart temporel en date. Par exemple s'il y a 2 jours d'écart ça te donnera alors 03/01/1970 (puisque le départ de la datation d'Unix commence au 01/01/1970).

    Donc 2 solutions
    1. tu utilises gmtime() puis tu affiches l'écart de chaque champ avec le 1/1/1970 (écart de tm_year avec 1970, écart de tm_mon avec 1 et etc etc). Ca te donnera un truc comme "pas fait de vaisselle depuis 2 ans, 3 mois et 5 jours" ce qui n'est pas forcément exact tout le temps. Par exemple 31 jours ça fait un mois si c'est en janvier mais un peu plus si c'est en février.
    2. tu convertis l'écart de dates en jours. Comme cet écart est comptabilisé en secondes suffit de le diviser par 86400. Ca te donnera un truc comme "pas de vaisselle depuis 183 jours". En continuant à diviser par 30 puis par 12 tu peux avoir une moyenne en mois et en années. Mais là aussi ça reste une moyenne.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci sve@r,
    oui, il y a ces 2 solutions, c'aurait été bien qu'une fonction puisse le convertir en stuct tm, dommage
    le calcul élément par élément, c'est sûr, ça je sais faire, mais ca fait beaucoup de lignes de codes pour pas grand chose si on veut être précis quelle que soit la période...
    je vais regarder tout ça. merci encore

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

Discussions similaires

  1. calcul sur les dates
    Par housni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/08/2007, 16h38
  2. Oracle 10g - calcul sur les dates
    Par themateo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/08/2007, 10h50
  3. Calcul sur les dates
    Par Stargate SG1 dans le forum Access
    Réponses: 2
    Dernier message: 04/02/2007, 16h09
  4. [Dates] Calcul sur les dates...
    Par gawelldanor dans le forum Langage
    Réponses: 10
    Dernier message: 04/04/2006, 11h07
  5. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14

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