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 :

La date du jour à partir de time(null)


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut La date du jour à partir de time(null)
    Salut
    J'essaye de réaliser un petit programme qui permet d'afficher la date d'aujourd'hui en se basant simplement sur le nombre de secondes écoulées depuis 1/1/1970 "time(null)". Il faut dans l'algorithme prendre en considération les année bissextiles et ne pas considérer tous les mois ayant le même nombre de jours (31 ou 30). Si c'est réalisable votre aide sera précieuse. Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je crois qu'il existe des fonctions toutes faites pour ça (genre localtime, fonction qui convertit un time_t en tm, structure qui a a priori ce qu'il te faut), mais autrement, pour des calculs plus sophistiqués sur les dates, je conseille boost::date_time.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    C'est vrai qu'il y a des fonctions toutes faites pour ce genre de choses, mais moi mon problème consiste à le faire avec des pures calculs, sans utiliser aucune fonction prédéfinie.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Bien que je me pose la question de savoir l'intérêt de la chose, voici ce que tu dois savoir
    60 secondes dans une minute
    60 minutes dans une heure
    24 heures dans une journée
    soit
    3600 secondes dans une heure
    86400 secondes dans une journée

    Une année est bissextile si
    elle est divisible par 4
    mais pas si
    elle est divisible par 100
    en le redevenant si
    elle est divisible par 1000

    Une année non bissextile compte 356 jours et une année bissextile en compte 356.

    Le premier janvier 1970 était un jeudi.

    Afin de te faciliter le travial, l'idéal, c'est de fournir une fonction qui calcule pour toi si une année était bissextile ou non... L'algorithme de cette fonction étant relativement simple et prenant la forme de
    booleen bissextile(int annee)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sinon si annee modulo 4 égal 0
    |    si annee modulo 1000 égal 0
    |    |    renvoie vrai
    |    sinon si annee modulo 100 égal 0
    |    |    renvoie faux
    |    sinon
    |    |    renvoie vrai
    sinon
    |    renvoie faux
    Dans la même optique, il serait judicieux de prévoir un tableaux contenant le nombre de jour de chaque mois, sous la forme la plus simple possible de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int numDays[12]={31, 0, 31, 30, 31, 30, 
                     31, 31, 30, 31, 30, 31};
    Si le deuxième mois est mis à 0, c'est simplement parce que la valeur réelle devra être préciser en fonction du fait que l'année est bissextile ou non, selon le principe de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si (bissextile(annee) est vrai)
    |    numDays[1]= 29;
    sinon 
    |    numDays[1] = 28;
    Le fait de pouvoir déterminer facilement le jour de la semaine serait également intéressant, et, comme le temps unix a commencé un jeudi, il pourrait prendre la forme d'un tableau de chaines de caractères comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string week[7]={"jeudi", "vendredi", "samedi", "dimanche", "lundi", 
                         "mardi","mercredi"};
    Une fois que tu dispose de tout cela, il devrait t'être facile de déterminer le jour et la date représentée par un nombre de secondes:
    Tu commence par effectuer la division entière du nombre de secondes par 86400 afin d'obtenir le nombre de jours
    tu peux directement utiliser ce nombre de jours pour indiquer le jour correspondant en prenant le reste de la division de ce nombre par 7 comme indice de week, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"c'était le "<<week[nombre_jour%7];
    Pour calculer la date, tu peux déjà commencer par soustraire le nombre de jour correspondant aux années pleine, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    annee = 1970
    tant que nombre_jours plus grand que 366
    |    si bissextile(annee) est vrai
    |    |    nombre_jours = nombre_jours - 366
    |    sinon
    |    |    nombre_jours = nombre_jours - 365
    |    fin si
    |    annee = annee +1
    fin tant
    Une fois toutes les années précédentes prises en compte, il ne te reste plus qu'à vérifier si l'année en cours est bissextile, et à retirer le nombre de jours des mois complets écoulés afin d'obtenir la date du mois en cours

    S'agissant finalement d'un exercice trivial, je n'ai pas voulu trop te mâcher la tâche en te donnant les codes tous faits... mais tu devrais être en mesure de te débrouiller avec ce qui précède
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Vraiment je te remercie pour cette aide précieuse que tu m'as fournie, j'ai pu enfin faire le programme en se basant sur une idée d'un internaute, il m'a fourni un indice et j'ai pu élaborer le code approprié.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je peux comprendre l'intérêt de le faire par une fonction toute faite. C'est le réflexe à avoir par défaut.
    Je peux comprendre l'intérêt de le faire à la main. C'est dans un but didactique.

    J'ai plus de mal à voir l'intérêt de le faire à la main en recopiant une fonction toute faite...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Je vous assure que c'est un travail 100% personnel, sans copier aucun bout de code. Je me suis basé sur les indications des internautes, et j'ai pu le faire moi-même. Sinon pourquoi j'irai me vanter avec un code minable par rapport aux vrais programmes, c'est totalement absurde. Je ne vois pas pourquoi vous avez des doutes, mais l'essentiel c'est que j'ai fait travailler mes méninges pendant une heure et je suis sorti tout "benef".

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A ceci près:
    1/ que 2000 est bissextile mais pas 2100. Le 29 fev. est mal géré
    2/ que c'est plein de variables globales
    3/ qu'à mon avis, on devrait d'abord sauter d'année en année, puis de mois en mois et enfin de jour en jour.

    [EDIT=pour Koala]: il me semble que malgré les 35h, les années restent à 365/366 jrs et non 356

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne dis pas que tu as copié, juste que tu proposes à la copie...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Ah d'accord !! On s'est mal compris, désolé. Si c'est dans l'intérêt des autres, je vais enlever le code sans problèmes. Pour les remarques de 3DArchi, je te remercie t'as tout à fait raison. Le 29 est mal géré, pour les variables globales je les ai utilisés parce que je viens de les étudier à peine, c'est pour ça. Même les tableaux en C++ je ne les ai pas encore vu. A propos de ta 3eme remarque, t'as vu les choses d'un autre angle, il se peut que ça soit plus performant, mais l'essentiel pour moi à me niveau c'est plus question de compilation et d'exécution que de performance de mémoire et vitesse. Je remercie tout le monde pour son aide.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    [EDIT=pour Koala]: il me semble que malgré les 35h, les années restent à 365/366 jrs et non 356
    oupppsss... mes doigts ont "fourché" ...

    Enfin, tout le monde aura compris que je voulais bien dire 365 et 366 jours

    Le pire, c'est que j'ai bien utilisé les bons nombres dans tous les algorithmes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Date du jour à partir d'un numéro de la semaine
    Par nancy169 dans le forum SQL
    Réponses: 6
    Dernier message: 12/01/2014, 21h03
  2. select à partir de la date du jour
    Par angeleweb dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/10/2007, 18h24
  3. Nom de jour à partir de la date
    Par bonano dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/07/2007, 10h20
  4. Réponses: 11
    Dernier message: 30/05/2007, 14h32
  5. [Date] Jour à partir de son numéro dans l'année
    Par boby123 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/11/2006, 16h58

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