Moment.js - como obtenho o número de anos desde uma data, não arredondado?


130

Estou tentando calcular a idade de uma pessoa usando o Moment.js , mas estou descobrindo que o método fromNow útil, de outra forma, completa os anos. Por exemplo, se hoje for 27/12/2012 e a data de nascimento da pessoa for 26/02/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()retornará 'há 35 anos'. Como posso fazer com que o Moment.js ignore o número de meses e simplesmente retorne o número de anos (ou seja, 34) desde a data?

Respostas:


215

Usar moment.js é tão fácil quanto:

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

Para referência adicional, você pode ler a documentação oficial do moment.js .


30

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

se você não deseja valores de fração:

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

se você deseja valores de fração:

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

As unidades podem ser [segundos, minutos, horas, dias, semanas, meses, anos]


3
Essa técnica é abordada pela resposta de @ ebeltran, e sua discussão sobre valores fracionários não tem nada a ver com a pergunta. Prefiro adicioná-lo como um comentário.
aknuds1

21

Parece haver uma função de diferença que aceita intervalos de tempo para usar, além de uma opção para não arredondar o resultado. Então, algo como

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

Eu não tentei isso e não estou completamente familiarizado com o momento, mas parece que isso deve obter o que você deseja (sem ter que redefinir o mês).


Parece que você não precisa receber o número do ponto flutuante a partir do momento e depois arredondá-lo para esse cenário. Parece que o momento está arredondando corretamente o resultado para o cálculo do ano usando diff.
Chris

31
De docs, desde 2.0.0, momento # diff voltará número arredondado para baixo, assim você só precisa: age = moment().diff(birthDate, 'years') .
SuperSkunk

13

Eu achei que funcionaria para redefinir o mês para janeiro para as duas datas (a data fornecida e o presente):

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

3
No momento.js v2.3.1, existe um método .fromNow () que também pode ser útil.
Lucas Lazaro

9

Este método é fácil e poderoso.

O valor é uma data e "DD-MM-AAAA" é a máscara da data.

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

6

Tente o seguinte:

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

Explicação:

Recebemos uma string assim: '23 dias atrás'. Divida-o em array: ['23', 'days', 'ago'] e depois pegue o primeiro item '23'.


3
Esta postagem está sendo sinalizada automaticamente como baixa qualidade porque é apenas um código. Você se importaria de expandi-lo adicionando algum texto para explicar como ele resolve o problema?
Taifun 12/06

3

Este método funciona para mim. Ele está verificando se a pessoa fez aniversário este ano e subtrai um ano caso contrário.

// 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: Primeira versão não funcionou perfeitamente. O atualizado deve


Isso funcionou para mim, se eu mudei os dias do ano para 365,25 para a conta para anos bissextos
bschipp

usando 365,25 é uma aproximação que pode acabar em lágrimas - tipo de cal 1752ver por que
pgee70

2

Se você não quiser usar nenhum módulo para cálculo de idade

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

2

Quando você deseja mostrar anos e os dias restantes:

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

Eu prefiro esse pequeno método.

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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.