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?

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 .


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]


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).


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"

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

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'.


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


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)

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

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.