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

JavaScript Discussion :

Calcul d'âge en année - mois et jours


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Calcul d'âge en année - mois et jours
    Bonjour,

    Pour un exercice en stage de développeur, on dois réaliser un script pour calculer l'âge de la personne et année+mois+jours.
    Pour l'instant je retourne que quelque chose du genre année + le reste en jours par le datetime * 86400000 /365 + %.

    Quelqu'un aurais une autre vision de ce cas ou un bout de script à partager ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Si tu veux te faciliter la tache il existe la lib moments.js

    Si tu veux le faire en js pur de base il va falloir diviser la différence obtenue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       var jour = 1000 * 60 * 60 * 24;
        var jours = Math.floor(diff/jour);
        var mois = Math.floor(jours/31); //*
        var années = Math.floor(mois/12);
    * avec ici l'approximation des mois 27 à 31 jours ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,

    Citation Envoyé par markusemile
    Pour un exercice en stage de développeur, on dois réaliser un script pour calculer l'âge de la personne et année+mois+jours.
    Je pense donc qu'il ne faut pas approximer, voire utiliser une bibli dans ce cas.

    Il te faut simplement
    • calculer le nombres d'années pleines ;
    • calculer le nombre de mois pleins ;
    • calculer le nombre de jours pleins.

    Pour chaque étape, années, mois et jours il te faut vérifier que la date de référence est inférieure à la date du jour, cela se fait facilement dans une boucle while, si l'on en a compris le principe, en incrémentant un compteur et en réajustant la date en sortie de boucle pour la suite

    Voici un exemple de ce que cela pourrait être :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    const DAY_TIME = 3600 * 24 * 1000;
    const today = new Date();
      // reset sur date du jour
      today.setHours(0);
      today.setMinutes(0);
      today.setSeconds(0);
     
    // date de référence
    // exemple attention mois indexé de 0 à 11 -- ci-dessous  10 Décembre 1980
    let dateRef = new Date("1980", "11", "10");
    // affichage
    console.log("today :", today.toString());
    console.log("dateRef :", dateRef.toString());
    // objet résultat
    const ecart = {
      years: 0,
      months: 0,
      days: 0,
      inDays: 0
    };
     
    // calcul en jours pleins
    ecart.inDays = ((today.getTime() - dateRef.getTime()) / DAY_TIME) >> 0;
     
    // nombre d'années complétes
    // on se place sur l'année suivante
    dateRef.setFullYear(dateRef.getFullYear() + 1);
    while (dateRef < today) {
      ecart.years += 1;
      dateRef.setFullYear(dateRef.getFullYear() + 1);
    }
    // réajuste la date en sortie de boucle
    dateRef.setFullYear(dateRef.getFullYear() - 1);
     
    // nombre de mois complets
    // on se place sur le mois suivant
    dateRef.setMonth(dateRef.getMonth() + 1);
    while (dateRef < today) {
      ecart.months += 1;
      dateRef.setMonth(dateRef.getMonth() + 1);
    }
    // réajuste la date en sortie de boucle
    dateRef.setMonth(dateRef.getMonth() - 1);
     
    // nombre de jours complets
    // on se place sur le jour suivant
    dateRef.setDate(dateRef.getDate() + 1);
    while (dateRef < today) {
      ecart.days += 1;
      dateRef.setDate(dateRef.getDate() + 1);
    }
     
    // affiche résultat
    console.log("Ecart :", ecart);
    Le résultat est disponible dans un object pour plus de clarté, enfin il me semble.

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    @NoSmoking : momentjs est d'accord avec ton code, il y a 38 ans, 10 mois et 19 jours d'écart avec aujourd'hui le 2019-10-29

    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
    let a = moment([1980, 11, 10]);
    let b = moment([2019, 9, 29]);
     
    console.log(new kDvjhDate(a).toString()); // 1980-12-10T00:00:00.000+0100
     
    let y = b.diff(a, 'year')
     
    console.log(y); // 38 ans
     
    a = a.add(y, 'year')
     
    console.log(new kDvjhDate(a).toString()); // 2018-12-10T00:00:00.000+0100
     
    let m = b.diff(a, 'month')
     
    console.log(m); // 10 mois
     
    a = a.add(m, 'month')
     
    console.log(new kDvjhDate(a).toString()); // 2019-10-10T00:00:00.000+0200
     
    let d = b.diff(a, 'day')
     
    console.log(d); // 19 jours
     
    a = a.add(d, 'day')
     
    console.log(new kDvjhDate(a).toString()); // 2019-10-29T00:00:00.000+0100
     
    /*
    Ecart : {years: 38, months: 10, days: 19, inDays: 14202}
    */

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Citation Envoyé par danielhagnoul
    @NoSmoking : momentjs est d'accord avec ton code(...)
    Ouf !!! même si je trouve leur solution plutôt alambiquée, mais peut être plus complète car tenant en plus compte de l'UTC !

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Pour le nombre d'années on peut éviter la boucle while, non ?
    En prenant la partie entière de la division du nombre de jours par 365 (ou par 365.25) on devrait obtenir le même résultat...

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Citation Envoyé par Beginner.
    Pour le nombre d'années on peut éviter la boucle while, non ?
    ce ne sont pas les méthodes qui manquent, celle que j'ai mis reste homogène quant à son déroulement, la dateRef étant le facteur commun évolutif.

    On aurait pu également faire, pour le nombre d'années, quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let diffMois = (((today.getFullYear() - dateRef.getFullYear()) * 12) + (today.getMonth() - dateRef.getMonth()));
    console.log("total months :", diffMois);
    console.log("nbr years :", parseInt(diffMois / 12, 10));
    console.log("nbr months :", parseInt((diffMois / 12 - parseInt(diffMois / 12, 10)) * 12,10));
    Il faudrait bien sûr réajuster en fonction des jours pour n'avoir qu'un nombre de mois pleins.

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Oui effectivement ce ne sont pas les méthodes qui manquent.

Discussions similaires

  1. [Vxi3] Calcul d'une période en Années, Mois et jour ?
    Par Sarturi dans le forum Webi
    Réponses: 1
    Dernier message: 09/02/2015, 11h27
  2. Comment calculer l'age en année mois et jours en vb6 avec dtpicker
    Par abfalog dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/05/2013, 22h39
  3. Calculer l'âge en année, mois et jour
    Par Shaco dans le forum C#
    Réponses: 14
    Dernier message: 23/10/2012, 16h10
  4. Réponses: 7
    Dernier message: 18/06/2007, 16h40
  5. Réponses: 2
    Dernier message: 21/07/2006, 14h04

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