Estoy tratando de obtener la diferencia entre la hora local actual y el 1 de diciembre de 2021 a las 4 p. m. Hay una diferencia de 6 meses y 2 horas. En este caso, espero que la respuesta sea algo similar a 6.02. Pero 5.98 está llegando. ¿Cómo puedo obtener la respuesta que quiero?
De acuerdo con los documentos de moment.js , la forma estándar de obtener la diferencia entre dos fechas en su ejemplo sería now.diff(date, 'months', true) , que debería devolver un número de punto flotante mayor que 6.
now.diff(date) devuelve la diferencia de milisegundos entre esos dos puntos en el tiempo. Llamar moment.duration({milliseconds}).asMonths() no es ideal porque algunos meses pueden tener 30 días y otros pueden tener 31 días. Parece que moment.js usa entre 30 y 31 días como la duración de un mes. Para abordar este problema, moment.js ha discutido las diferencias de calendario en los documentos:
moment#difftiene un manejo especial para las diferencias de mes y año. Está optimizado para garantizar que dos meses con la misma fecha estén siempre separados por un número entero.Así que del 15 de enero al 15 de febrero debería ser exactamente 1 mes.
Del 28 de febrero al 28 de marzo debería ser exactamente 1 mes.
Del 28 de febrero de 2011 al 28 de febrero de 2012 debe ser exactamente 1 año.
La definición de "un mes" solo puede ser "confusa", ya que los meses del calendario tienen diferentes duraciones. Una forma de definirlo sería dividir el año en 12 partes iguales y usar eso como una "métrica mensual":
function monthsUntil(year,month,day,hour=0){ const trg=new Date(year,month-1,day,hour,0,0), now=new Date(), nxt=new Date(); nxt.setFullYear(nxt.getFullYear()+1); return (12*(trg-now)/(nxt-now)).toFixed(4); } console.log(monthsUntil(2022,12,1,16))