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 :

Comment obtenir une date à partir de son numéro de jour dans l'année?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comment obtenir une date à partir de son numéro de jour dans l'année?
    Bonjour à tous,

    Je cherche à exprimer une date au format dd/mm/yyyy à partir de son numéro du jour dans l'année en langage C.

    J'ai pensé à récupérer la date d'aujourd'hui, ainsi j'ai son numéro du jour dans l'année grâce à la structure tm remplie par la fonction gmtime.
    Puis faire la différence entre le numéro du jour dans l'année ainsi obtenu et le numéro du jour dans l'année dont je cherche la date au format dd/mm/yyyy correspondante.
    Enfin, retirer cette différence à la date d'aujourd'hui pour obtenir la date recherchée. Néanmoins cette dernière étape me pose problème car je sais pas comment retirer x jours à une date pour obtenir une date et si c'est facile en C.

    Si quelqu'un a une solution plus simple à proposer ou peut me débloquer sur ce dernier point dans la solution que j'ai commencé à entreprendre, je lui en serai extrêmement reconnaissant car ça fait un bout de temps que je me torture l'esprit sans aboutir à la résolution du problème!

    Voici mon bout de 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
    #include <stdio.h>
    #include <time.h>
     
    int main(void)
    {
    char *date_jour;
    struct tm *ptm;
    time_t sysdat;
    int no_jour = 125;
    int diff_nb_jour;
     
    /* date du jour au format date universel */
    sysdat = time(NULL);
    ptm = gmtime(&sysdat);
     
    /* affichage date du jour au format mm/dd/yy */
    strftime(date_jour,9,"%D",ptm);
    printf("date_jour=%s\n",date_jour);
     
    /* difference entre numero date du jour dans l'annee et numero date dans l'annee dont on recherche sa correspondance au format mm/dd/yy */
    if(no_jour < ptm->tm_yday)
      diff_nb_jour = ptm->tm_yday - no_jour;
    else if(no_jour > ptm->tm_yday)
      printf("ca ne devrait pas arriver\n");
     
    /* Affichage date recherchee au format "mm/dd/yy" */
     
    /******et là je sais pas comment faire************/
     
     
     
    ptm = gmtime(&sysdat);
    strftime(date_result,9,"%D",ptm);
    printf("date_result=%s\n",date_jour);
     
    /****************************************/
     
    return 0;
    }
    Merci d'avance!

  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 ophdia
    Bonjour à tous,

    Je cherche à exprimer une date au format dd/mm/yyyy à partir de son numéro du jour dans l'année en langage C.
    Le principe est d'initialiser une struct tm a 0, puis de mettre a jour l'année (.tm_year) et le jour (.tm_mday). Un appel à mktime() recalcule la date en fonction de ces éléments.

    Voici un petit code qui montre ce qui se passe :
    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
     
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
     
    int main ()
    {
       time_t stamp = time(NULL);
       struct tm now = *localtime(&stamp);
       char s[128];
       strftime(s, sizeof s, "%d/%m/%Y", &now);
       printf ("%s\n", s);
     
       memset(&now, 0, sizeof now);
     
       strftime(s, sizeof s, "%d/%m/%Y", &now);
       printf ("%s\n", s);
     
       now.tm_mday = 360; /* numero du jour */
       now.tm_year = 2006 - 1900;
     
       if (mktime (&now) != -1)
       {
          strftime(s, sizeof s, "%d/%m/%Y", &now);
          printf ("%s\n", s);
       }
       else
       {
          puts("mktime() error");
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    24/09/2006
    00/01/1900
    26/12/2006
     
    Press ENTER to continue.
    Pose des questions si tu ne comprends pas.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comment obtenir une date à partir de son numéro de jour dans l'année?
    Merci ta réponse m'a débloquée et j'ai fait quelques petits tests qui répondent à mes attentes. Néanmoins, je ne comprends pas pourquoi tm.mday contient le numero du jour dans l'année alors que j'aurais pensé que ce serait plutôt le champ tm.yday qui devait être initialisé à cette valeur et pourquoi est-il nécessaire d'initialiser le champ tm.year?

  4. #4
    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 ophdia
    je ne comprends pas pourquoi tm.mday contient le numero du jour dans l'année alors que j'aurais pensé que ce serait plutôt le champ tm.yday qui devait être initialisé à cette valeur
    Moi aussi, mais il n'y a pas grand chose à comprendre. Les gens qui ont défini la fonction ont fait ce choix, ils avaient leurs raisons, il faut s'y plier, c'est tout...

    Toujours lire la doc des fonctions avant de les utiliser. Il n'y rien d'évident ou de sous-entendu. Il y a une définition et il faut s'y tenir.

    et pourquoi est-il nécessaire d'initialiser le champ tm.year?
    Tu veux une date, non ? Avec un numéro annuel de jour, on a une date partielle, et elle est douteuse (à un jour près) à partir du 28 Février. Il faut donc au moins savoir si l'année est bissextile.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comment obtenir une date à partir de son numéro de jour dans l'année?
    Bonjour Emmanuel,

    dsl d'insister mais moi quand je lit le man:
    tm_yday
    Le nombre de jours écoulés depuis le 1er Janvier, dans l’intervalle 0 à 365 (0 à 364 si l’année n’est pas
    bissextile). (c le cas pour 2006)
    tm_mday
    Le quantième du mois, dans l’intervalle 1 à 31.
    je comprend qu'il faut choisir tm_yday comme champ dans la structure tm et non tm_mday.

    Pour ta deuxième explication concernant le champ tm_year, ton explication me va et je l'accepte volontier!

  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 ophdia
    dsl d'insister mais moi quand je lit le man:
    tm_yday
    Le nombre de jours écoulés depuis le 1er Janvier, dans l’intervalle 0 à 365 (0 à 364 si l’année n’est pas
    bissextile). (c le cas pour 2006)
    tm_mday
    Le quantième du mois, dans l’intervalle 1 à 31.
    je comprend qu'il faut choisir tm_yday comme champ dans la structure tm et non tm_mday.
    Après, il faut lire la doc de mktime()... Il ajuste la date à partir de tm_mday, mais pas à partir de tm_yday. C'est comme ça, j'y peux rien !
    La fonction mktime() convertit la date timeptr exprimée sous forme struct tm en une date locale sous forme time_t. La fonction ignore les valeurs transmises des membres tm_wday et tm_yday de la structure, et les recalcule en utilisant les autres membres. Si des membres de la structure débordent de l'intervalle autorisé, ils seront corrigés (par exemple le 40 Octobre devient le 9 Novembre). L'appel de mktime() renseigne également la variable externe tzname avec les informations concernant le fuseau horaire. Si la structure transmise ne peut pas être convertie, mktime() renvoie la valeur (time_t)(-1) et ne modifie pas les membres tm_wday et tm_yday.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Après, il faut lire la doc de mktime()... Il ajuste la date à partir de tm_mday, mais pas à partir de tm_yday. C'est comme ça, j'y peux rien !
    En fait, c'est pas qu'il les ignore, c'est qu'il les recalcule et remplit ce champs de la structure pour toi...

    Par contre, il faut faire attention, tm_yday commence à 0 (0 signifie le 1er Janvier) tandis que tm_mday doit commencer à 1 (1 signifie le 1er Janvier)...

    Jc

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/10/2007, 07h20
  2. [VB.Net] Obtenir une date à partir d'un numero de semaine
    Par tonysky dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/01/2007, 08h57
  3. comment obtenir une date precedente ?
    Par MAJIK_ENIS dans le forum Langage
    Réponses: 9
    Dernier message: 08/06/2006, 16h53
  4. Réponses: 10
    Dernier message: 09/01/2006, 18h39
  5. comment obtenir une date dans une storeproc?
    Par Dnx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/10/2005, 15h19

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