Estoy tratando de calcular la edad de una persona usando D3.js. Tengo el siguiente código:
d3.timeYear.count(Birth_date, Current_date);
Birth_date es la fecha de nacimiento de una persona (un objeto Date) y Current_date es, bueno, la fecha en la que me gustaría calcular la edad de la persona. Para poder responder "si naciste el 5 de mayo de 1975, ¿cuántos años tenías el 3 de mayo de 1976".
d3.timeYear.count() parece redux las fechas hasta el comienzo del año, por lo que en mi ejemplo, mi código devolverá 1 el 1 de enero de 1976, aunque faltaban 5 meses para su primer cumpleaños.
Podría contar la cantidad de días en lugar de los años, pero podría obtener resultados erróneos localmente según la cantidad de días del año.
Lo siguiente se basa en el objeto Date de JavaScript y debería hacer el trabajo:
function age(by,bm,bd){
const D=new Date(), y=D.getFullYear(),
md=D.getMonth()-bm, dd=D.getDate()-bd;
return y-by-(md>0||!md&&dd>=0?0:1);
}
console.log(age(1992,8,26))
Básicamente devuelvo la diferencia entre el año completo de hoy y el cumpleaños. Pero también compruebo si el mes actual es mayor que el mes de cumpleaños o ( || ) si la diferencia de mes es cero ( !md es true ) y ( && ) la diferencia de día dd es mayor que cero. Si ese es el caso resto 0 de lo contrario 1 de la diferencia de año.
Y tenga en cuenta que mi función age() espera que el mes se ingrese en notación JavaScript. Esto significa que el 8 en el ejemplo anterior se refiere al mes de septiembre.
La respuesta de Carsten Massman me inspiró a hacer esta función, que resuelve mi problema:
function age(birthdate, currentdate){
const bDay = birthdate.getDate(); // Get the birthdate's day.
const bMonth = birthdate.getMonth(); // Get the birthdate's month.
const currYear = currentdate.getFullYear(); // Get the current date's year.
const currBirthday = new Date(currYear + "/" + (bMonth + 1) + "/" + bDay); // Contruct the date of the birthday in the current year
const daysToBirthday = d3.timeDay.count( d3.timeYear.floor(currBirthday), currBirthday); // Count the # of days since Jan. 1st this year
// Offset the current date in the past by the number of days computed above.
const offsetCurrent = d3.timeDay.offset(currentdate, -daysToBirthday);
// Compute the number of years between the two dates (floored to the beginning of their respective year).
return d3.timeYear.count(birthdate, offsetCurrent);
}
Esto calcula la edad para cualquier fecha de nacimiento, y en cualquier momento posterior, utilizando principalmente d3-time y un poco de métodos de fecha de javascript de vainilla.