Moment.js - comment obtenir le nombre d'années depuis une date, non arrondi?

130

J'essaie de calculer l'âge d'une personne en utilisant Moment.js , mais je trouve que la méthode fromNow par ailleurs utile arrondit les années. Par exemple, si aujourd'hui est le 27/12/2012 et que la date de naissance de la personne est le 26/02/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()renvoie «il y a 35 ans». Comment puis-je faire en sorte que Moment.js ignore le nombre de mois et renvoie simplement le nombre d'années (c'est-à-dire 34) depuis la date?

aknuds1
la source

Réponses:

216

Utiliser moment.js est aussi simple que:

var years = moment().diff('1981-01-01', 'years');
var days = moment().diff('1981-01-01', 'days');

Pour plus d'informations, vous pouvez lire la documentation officielle de moment.js .

Edwin Beltran
la source
30

http://jsfiddle.net/xR8t5/27/

si vous ne voulez pas de valeurs de fraction:

var years = moment().diff('1981-01-01', 'years',false);
alert( years);

si vous voulez des valeurs de fraction:

var years = moment().diff('1981-01-01', 'years',true);
alert( years);

Les unités peuvent être [secondes, minutes, heures, jours, semaines, mois, années]

Razan Paul
la source
3
Cette technique est couverte par la réponse de @ ebeltran, et votre discussion sur les valeurs fractionnaires n'a rien à voir avec la question. Je préfère l'ajouter en commentaire.
aknuds1
21

Il semble y avoir une fonction de différence qui accepte les intervalles de temps à utiliser ainsi qu'une option pour ne pas arrondir le résultat. Alors, quelque chose comme

Math.floor(moment(new Date()).diff(moment("02/26/1978","MM/DD/YYYY"),'years',true)))

Je n'ai pas essayé cela, et je ne connais pas complètement le moment, mais il semble que cela devrait obtenir ce que vous voulez (sans avoir à réinitialiser le mois).

user4815162342
la source
Il semble que vous n'avez pas besoin de recevoir le nombre à virgule flottante à partir du moment, puis de l'arrondir vous-même, pour ce scénario. Il semble que le moment arrondisse correctement le résultat du calcul de l'année en utilisant diff.
chris
31
De la documentation, depuis 2.0.0, le moment # diff renvoie nombre arrondi vers le bas, de sorte que vous ne devez: age = moment().diff(birthDate, 'years') .
SuperSkunk
13

J'ai trouvé que cela fonctionnerait de réinitialiser le mois à janvier pour les deux dates (la date fournie et le présent):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
aknuds1
la source
3
Dans moment.js v2.3.1, il existe une méthode .fromNow () qui peut également être utile.
Lucas Lazaro
9

Cette méthode est simple et puissante.

La valeur est une date et "JJ-MM-AAAA" est le masque de la date.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');
user2327748
la source
6

Essaye ça:

 moment("02/26/1978", "MM/DD/YYYY").fromNow().split(" ")[0];

Explication:

Nous recevons une chaîne quelque chose comme ceci: "il y a 23 jours". Divisez-le en tableau: ['23', 'days', 'ago'], puis prenez le premier élément '23'.

Fyodor Khruschov
la source
3
Ce message est automatiquement signalé comme étant de mauvaise qualité car il ne s'agit que de code. Pourriez-vous l'élargir en ajoutant du texte pour expliquer comment cela résout le problème?
Taifun
3

Cette méthode fonctionne pour moi. Il vérifie si la personne a eu son anniversaire cette année et soustrait un an dans le cas contraire.

// date is the moment you're calculating the age of
var now = moment().unix();
var then = date.unix();
var diff = (now - then) / (60 * 60 * 24 * 365);
var years = Math.floor(diff);

Edit: La première version ne fonctionnait pas parfaitement. La mise à jour devrait

Rickard Andersson
la source
Cela a fonctionné pour moi si je changeais les jours de l'année en 365,25 pour tenir compte des années bissextiles
bschipp
l'utilisation de 365,25 est une approximation qui peut finir en larmes - tapez cal 1752pour voir pourquoi
pgee70
2

Si vous ne souhaitez utiliser aucun module pour le calcul de l'âge

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)
Ankit
la source
2

Lorsque vous souhaitez afficher les années et les jours restants:

var m = moment(d.birthday.date, "DD.MM.YYYY");
var years = moment().diff(m, 'years', false);
var days = moment().diff(m.add(years, 'years'), 'days', false);
alert(years + ' years, ' + days + ' days');
Xdg
la source
0

Je préfère cette petite méthode.

function getAgeFromBirthday(birthday) {
    if(birthday){
      var totalMonths = moment().diff(birthday, 'months');
      var years = parseInt(totalMonths / 12);
      var months = totalMonths % 12;
        if(months !== 0){
           return parseFloat(years + '.' + months);
         }
    return years;
      }
    return null;
}
Dagan Bog-Computers
la source