Moment.js - come posso ottenere il numero di anni da una data, non arrotondato per eccesso?


130

Sto cercando di calcolare l'età di una persona usando Moment.js , ma sto scoprendo che il metodo altrimenti utile di Now ora completa gli anni. Ad esempio, se oggi è il 27/12/2012 e la data di nascita della persona è il 26/02/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()restituisce '35 anni fa '. Come posso fare in modo che Moment.js ignori il numero di mesi e semplicemente restituisca il numero di anni (ovvero 34) dalla data?

Risposte:


216

L'uso di moment.js è semplice come:

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

Per ulteriori riferimenti, è possibile leggere la documentazione ufficiale di moment.js .


30

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

se non si desidera valori di frazione:

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

se vuoi valori di frazione:

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

Le unità possono essere [secondi, minuti, ore, giorni, settimane, mesi, anni]


3
Questa tecnica è coperta dalla risposta di @ ebeltran e la tua discussione sui valori frazionari non ha nulla a che fare con la domanda. Preferirei aggiungerlo come commento.
aknuds1,

21

Sembra che ci sia una funzione di differenza che accetta intervalli di tempo da usare e un'opzione per non arrotondare il risultato. Quindi qualcosa del genere

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

Non ho provato questo, e non ho familiarità con il momento, ma sembra che questo dovrebbe ottenere quello che vuoi (senza dover reimpostare il mese).


Sembra che non sia necessario ricevere il numero in virgola mobile dal momento e quindi arrotondarlo da soli, per questo scenario. Sembra che il momento stia arrotondando correttamente il risultato per il calcolo dell'anno usando diff.
chris,

31
Dalla documentazione, in quanto 2.0.0, momento # diff tornerà numero arrotondato per difetto, in modo che solo bisogno di: age = moment().diff(birthDate, 'years') .
SuperSkunk,

13

Ho scoperto che avrebbe funzionato per ripristinare il mese a gennaio per entrambe le date (la data e il presente forniti):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"

3
In moment.js v2.3.1 esiste un metodo .fromNow () che può anche essere utile.
Lucas Lazaro,

9

Questo metodo è semplice e potente.

Il valore è una data e "GG-MM-AAAA" è la maschera della data.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');

6

Prova questo:

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

Spiegazione:

Riceviamo una stringa simile a questa: "23 giorni fa". Dividilo nell'array: ['23', 'days', 'ago'] e quindi prendi il primo elemento '23'.


3
Questo post viene automaticamente contrassegnato come di bassa qualità perché è solo un codice. Ti dispiacerebbe espanderlo aggiungendo del testo per spiegare come risolve il problema?
Taifun,

3

Questo metodo funziona per me. Sta controllando se la persona ha avuto il suo compleanno quest'anno e sottrae altrimenti un anno.

// 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);

Modifica: la prima versione non ha funzionato perfettamente. Quello aggiornato dovrebbe


Questo ha funzionato per me se ho cambiato i giorni dell'anno a 365,25 per tenere conto degli anni bisestili
bschipp

usare 365.25 è un'approssimazione che può finire in lacrime - digitate cal 1752per capire perché
pgee70

2

Se non si desidera utilizzare alcun modulo per il calcolo dell'età

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

2

Quando vuoi mostrare gli anni e i giorni rimanenti:

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');

0

Preferisco questo piccolo metodo.

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.