Estoy tratando de escribir un programa para calcular mi edad exacta, al día, para que se envíe a una cadena, para que se muestre en mi sitio web. Mi código hasta ahora es el siguiente:
// establishing today's date let currentTime = new Date(); let month = currentTime.getMonth() + 1; let day = currentTime.getDate(); let year = currentTime.getFullYear(); // my birthdate const birthMonth = 7; const birthDay = 24; const birthYear = 2004; // comparing the two dates let monthDifference = Math.abs(month - birthMonth); let dayDifference = Math.abs(day - birthDay); let yearDifference = Math.abs(year - birthYear); // save and return the difference in a readable format let comparison = `${yearDifference} year, \ ${monthDifference} month, ${dayDifference} day`; document.getElementById("birthday paragraph").innerText = `I \ am a ${comparison} old programmer from Concord, Ohio.`; <div id="birthday paragraph"></div>Sin embargo, como puede ver en crossflame22.github.io (si aún no lo he solucionado), muestra el día incorrecto. Hoy, está mostrando 1 mes, 5 días. No tengo idea de cómo arreglar esto.
Respuesta corta: use una biblioteca (como date-fns ) en lugar de tratar de usar diferencias simples. Casi nunca hay una buena razón para tratar de hacer los cálculos de diferencia horaria usted mismo entre días, ya que sin duda lo hará mal. Si desea hacer esto con firmeza, debe manejar muchos casos extremos.
Respuesta larga: su lógica actual no tiene en cuenta los años bisiestos (que agregan días a su vida), pero también asume que estar en un mes adyacente le acredita un mes completo. Como ejemplo, digamos que nació el 31 de julio de 2021. Su código implicaría que tiene 1 mes inmediatamente el 1 de agosto de 2021 (aunque claramente solo tiene 1 día). Probablemente podrías hacer algo como lo que estás haciendo si los meses tuvieran la misma duración (no lo son) y los años tuvieran la misma duración (no lo son). Incluso los días pueden tener diferentes duraciones (ver segundos bisiestos), lo que puede afectar los cálculos a más largo plazo. Por lo tanto, debería buscar una biblioteca diseñada para manejar estos casos extremos por usted.
La respuesta anterior de rfestag es un buen consejo.
Sin embargo, echemos un vistazo al problema y tal vez ofrezcamos un enfoque simple.
Como señaló rfestag, los cálculos de fechas son muy complejos debido a los años bisiestos, los meses tienen diferentes duraciones, etc.
Olvídese de los años por un minuto y considere lo que significa decir "X meses de edad".
Un bebé nacido el 1 de enero tiene 3 meses el 31 de marzo (90 días).
Un bebé nacido el 1 de julio tiene 3 meses el 30 de septiembre (92 días).
¡Esos dos bebés de "3 meses" no tienen exactamente la misma edad!
Así que prueba este enfoque:
Calcule la diferencia entre los dos días y luego conviértala en un valor aproximado (años, meses, días).
// get your inputs however you like, I'll just hard code them const today = new Date(); const baseday = new Date("July 24, 2004"); let difference = today - baseday; difference /= 24*3600*1000; // convert milliseconds to days let yeardiff = Math.floor(difference/(365.25)); // whole number of average years let monthdiff = (difference - yeardiff*365.25); // last partial year let averagemonth = 365.25/12; // length of average month let months = Math.floor(monthdiff/averagemonth); let daysleft = Math.floor(monthdiff - months * averagemonth); console.log(yeardiff + " years, " + months + " months, " + daysleft + " days");Durante algunos días del año (principalmente alrededor del comienzo de los meses), puede estar apagado en los días, pero para fines generales debería ser lo suficientemente bueno.