Actualmente estoy usando un script para calcular el tiempo transcurrido en años, meses, días, etc. en Javascript.
$(document).ready(function(){ var birth_date = new Date('March, 25, 2022'); var years,months,days, hours, minutes, seconds; var ageCount = document.getElementById('counter'); setInterval(function(){ var current_date = new Date(); var YearDiff = (current_date.getYear() - birth_date.getYear()); var monthDiff = (current_date.getMonth() - birth_date.getMonth()); var daysDiff = (current_date.getDate() - birth_date.getDate()); var hoursDiff = (current_date.getHours() - birth_date.getHours()); var minDiff = (current_date.getMinutes() - birth_date.getMinutes()); var secDiff = (current_date.getSeconds() - birth_date.getSeconds()); ageCount.innerHTML=YearDiff+' Years '+monthDiff+' Months '+daysDiff+' Days '+hoursDiff+ ' Hours '+minDiff+' Minutes '+secDiff+' Seconds'; },500); });`Esto parece generar los meses, días y horas correctos cuando el día de la fecha establecida es más bajo que la fecha actual (es decir, el 21 de abril cuando ahora es el 22 de abril).
0 Years 1 Months 2 Days 8 Hours 14 Minutes 2 Seconds`Cuando el número del día de la fecha es mayor, lo cambia a un cierto número de meses menos un número de días. Así (1 mes - 4 días, cuando debería ser solo 0 meses y 27 días).
0 Years 1 Months -4 Days 8 Hours 14 Minutes 38 SecondsUn ejemplo del script se puede ver aquí: https://jsfiddle.net/j2k7n4zp/
¿Alguien tiene idea de qué va mal o qué debo arreglar para que calcule la cantidad correcta de días sin usar menos?
¡Gracias por adelantado!
Lo que está mal con su código es que asume que cada parte de una fecha posterior es más alta que cada parte de una anterior... por ejemplo... 23 de abril de 2022 al 1 de mayo de 2022 - la fecha es más baja, pero el mes es más alto - mientras que su código, ingenuamente, la parte de la fecha del 1 de mayo es mayor que el 23 de abril solo porque mayo es posterior a abril, pero no es así como funcionan las fechas
Aquí hay algo que literalmente preparé ahora, a ver si ayuda
const dateDiff = (from, to) => { // so we don't mutate passed in dates let start = new Date(from); let end = new Date(to); if (+start > +end) { [start, end] = [end, start]; } const loop = (prop) => { const set = `set${prop}`; const get = `get${prop}`; let ret = 0; while (1) { start[set](start[get]() + 1); if (start < end) { ret++; } else { start[set](start[get]() -1); break; } } return ret; } const years = loop('FullYear'); const months = loop('Month'); const days = loop('Date'); const hours = loop('Hours'); const minutes = loop('Minutes'); const seconds = loop('Seconds'); const milliseconds = loop('Milliseconds'); return {years, months, days, hours, minutes, seconds, milliseconds} } const ageCount = document.getElementById('counter'); setInterval(() => { const r = dateDiff(new Date(), new Date('2022-03-25')); ageCount.innerHTML = `${r.years} Years, ${r.months} Months, ${r.days} Days, ${r.hours} Hours, ${r.minutes} Minutes, ${r.seconds} Seconds`; }, 500); <div id="counter"> </div>