Moment.js: ¿cómo obtengo el número de años transcurridos desde una fecha, sin redondear?

130

Estoy tratando de calcular la edad de una persona usando Moment.js , pero estoy descubriendo que el método útil de Now ahora redondea los años. Por ejemplo, si hoy es 27/12/2012 y la fecha de nacimiento de la persona es 26/02/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()regresa '35 años atrás '. ¿Cómo puedo hacer que Moment.js ignore el número de meses y simplemente devuelva el número de años (es decir, 34) desde la fecha?

aknuds1
fuente

Respuestas:

216

Usar moment.js es tan fácil como:

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

Para referencia adicional, puede leer la documentación oficial de moment.js .

Edwin Beltran
fuente
30

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

si no quieres valores de fracción:

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

si quieres valores de fracción:

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

Las unidades pueden ser [segundos, minutos, horas, días, semanas, meses, años]

Razan Paul
fuente
3
Esta técnica está cubierta por la respuesta de @ebeltran, y su discusión sobre los valores fraccionarios no tiene nada que ver con la pregunta. Prefiero agregarlo como un comentario.
aknuds1
21

Parece haber una función de diferencia que acepta intervalos de tiempo para usar, así como una opción para no redondear el resultado. Entonces, algo como

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

No he intentado esto, y no estoy completamente familiarizado con el momento, pero parece que esto debería obtener lo que quieres (sin tener que reiniciar el mes).

usuario4815162342
fuente
Parece que no necesita recibir el número de coma flotante desde el momento y luego redondearlo usted mismo, para este escenario. Parece que el momento está redondeando correctamente el resultado para el cálculo del año usando diff.
Chris
31
A partir de los documentos, ya que 2.0.0, momento # diff devolverá el número redondeado a la baja, por lo que sólo necesita: age = moment().diff(birthDate, 'years') .
SuperSkunk
13

Descubrí que funcionaría restablecer el mes a enero para ambas fechas (la fecha proporcionada y el presente):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
aknuds1
fuente
3
En moment.js v2.3.1 hay un método .fromNow () que también puede ser útil.
Lucas Lazaro
9

Este método es fácil y poderoso.

El valor es una fecha y "DD-MM-AAAA" es la máscara de la fecha.

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

Prueba esto:

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

Explicación:

Recibimos una cadena como esta: "hace 23 días". Dividirlo en una matriz: ['23', 'días', 'ago'] y luego tomar el primer elemento '23'.

Fyodor Khruschov
fuente
3
Esta publicación se marca automáticamente como de baja calidad porque es solo código. ¿Te importaría expandirlo agregando texto para explicar cómo resuelve el problema?
Taifun
3

Este método me funciona. Está verificando si la persona ha cumplido años este año y, si no, resta un año.

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

Editar: La primera versión no funcionó perfectamente. El actualizado debería

Rickard Andersson
fuente
Esto funcionó para mí si cambiaba los días del año a 365.25 para tener en cuenta los años bisiestos
bschipp
usar 365.25 es una aproximación que puede terminar en lágrimas - escriba cal 1752para ver por qué
pgee70
2

Si no desea utilizar ningún módulo para calcular la edad

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

Cuando quieras mostrar años y los días 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');
Xdg
fuente
0

Prefiero este pequeño 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;
}
Dagan Bog-Computers
fuente