¿Cómo resolvería la diferencia para dos objetos Date () en JavaScript, mientras solo devuelvo el número de meses en la diferencia?
Cualquier ayuda sería genial :)
javascript
date
datediff
williamtroup
fuente
fuente
Respuestas:
La definición de "el número de meses en la diferencia" está sujeta a mucha interpretación. :-)
Puede obtener el año, mes y día del mes a partir de un objeto de fecha de JavaScript. Dependiendo de la información que esté buscando, puede usarlos para calcular cuántos meses hay entre dos puntos en el tiempo.
Por ejemplo, fuera de lugar:
Mostrar fragmento de código
(Tenga en cuenta que los valores de mes en JavaScript comienzan con 0 = enero).
Incluir meses fraccionarios en lo anterior es mucho más complicado, porque tres días en un febrero típico es una fracción mayor de ese mes (~ 10.714%) que tres días en agosto (~ 9.677%), y por supuesto, incluso febrero es un objetivo móvil dependiendo de si es un año bisiesto.
También hay algunas bibliotecas de fecha y hora disponibles para JavaScript que probablemente faciliten este tipo de cosas.
Nota : Solía haber un
+ 1
en lo anterior, aquí:Eso es porque originalmente dije:
Lo he eliminado por dos razones:
Sin contar los meses parciales resulta que no es lo que quieren (¿la mayoría?) Las personas que llegan a la respuesta, así que pensé que debería separarlos.
No siempre funcionó incluso con esa definición. :-D (lo siento)
fuente
Si no considera el día del mes, esta es la solución más simple.
Tenga en cuenta que el índice mensual está basado en 0. Esto significa que
January = 0
yDecember = 11
.fuente
A veces es posible que desee obtener solo la cantidad de meses entre dos fechas ignorando totalmente la parte del día. Entonces, por ejemplo, si tuvo dos fechas: 2013/06/21 y 2013/10 / 18- y solo le importaron las partes 2013/06 y 2013/10, estos son los escenarios y las posibles soluciones:
1.Si desea solo el número de meses entre las dos fechas, excluyendo ambos mes1 y mes2
2.Si quieres incluir alguno de los meses
3.Si quieres incluir los dos meses
fuente
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
que hace lo mismo pero es más semánticamente correcto para míAquí hay una función que proporciona con precisión el número de meses entre 2 fechas.
El comportamiento predeterminado solo cuenta meses completos, por ejemplo, 3 meses y 1 día dará como resultado una diferencia de 3 meses. Puede evitar esto configurando el parámetro
roundUpFractionalMonths
comotrue
, por lo que una diferencia de 3 meses y 1 día se devolverá como 4 meses.La respuesta aceptada arriba (respuesta de TJ Crowder) no es precisa, a veces devuelve valores incorrectos.
Por ejemplo,
monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))
devuelve0
que obviamente es incorrecto. La diferencia correcta es 1 mes completo o 2 meses redondeados.Aquí está la función que escribí:
fuente
Si necesita contar meses completos, independientemente de que el mes sea 28, 29, 30 o 31 días. A continuación debería funcionar.
Esta es una versión extendida de la respuesta https://stackoverflow.com/a/4312956/1987208, pero corrige el caso en el que calcula 1 mes para el caso del 31 de enero al 1 de febrero (1 día).
Esto cubrirá lo siguiente;
fuente
Diferencia en meses entre dos fechas en JavaScript:
meses totales entre fecha_inicio y fecha_finalización:
fuente
Sé que esto es muy tarde, pero publicarlo de todos modos en caso de que ayude a otros. Aquí hay una función que se me ocurrió que parece hacer un buen trabajo al contar las diferencias en meses entre dos fechas. Es cierto que es mucho más atrevido que Mr.Crowder, pero proporciona resultados más precisos al pasar por el objeto de fecha. Está en AS3, pero debería poder soltar la escritura fuerte y tendrá JS. ¡Siéntase libre de hacer que se vea mejor a cualquiera!
fuente
Para ampliar la respuesta de @ TJ, si está buscando meses simples, en lugar de meses calendario completos, puede verificar si la fecha de d2 es mayor o igual que d1. Es decir, si d2 es más tarde en su mes que d1 en su mes, entonces hay 1 mes más. Entonces deberías poder hacer esto:
Esto no tiene en cuenta los problemas de tiempo (por ejemplo, el 3 de marzo a las 4:00 p.m. y el 3 de abril a las 3:00 p.m.), pero es más preciso y solo tiene un par de líneas de código.
fuente
Considere cada fecha en términos de meses, luego reste para encontrar la diferencia.
Esto le dará la diferencia de meses entre las dos fechas, ignorando los días.
fuente
Hay dos enfoques, matemático y rápido, pero sujeto a caprichos en el calendario, o iterativo y lento, pero maneja todas las rarezas (o al menos los delegados las manejan en una biblioteca bien probada).
Si itera por el calendario, incremente la fecha de inicio en un mes y vea si pasamos la fecha de finalización. Esto delega el manejo de anomalías a las clases integradas Date (), pero podría ser lento SI está haciendo esto por un gran número de fechas. La respuesta de James toma este enfoque. Por mucho que no me guste la idea, creo que este es el enfoque "más seguro", y si solo está haciendo un cálculo, la diferencia de rendimiento es realmente insignificante. Tendemos a tratar de optimizar las tareas que solo se realizarán una vez.
Ahora, si está calculando esta función en un conjunto de datos, probablemente no quiera ejecutar esa función en cada fila (o Dios no lo quiera, varias veces por registro). En ese caso, puede usar casi cualquiera de las otras respuestas aquí excepto la respuesta aceptada, que es simplemente incorrecta (la diferencia entre
new Date()
ynew Date()
es -1).Aquí está mi apuesta por un enfoque matemático y rápido, que representa diferentes duraciones de meses y años bisiestos. Realmente solo debería usar una función como esta si la aplicará a un conjunto de datos (haciendo este cálculo una y otra vez). Si solo necesita hacerlo una vez, use el enfoque iterativo de James anterior, ya que está delegando el manejo de todas las (muchas) excepciones al objeto Date ().
fuente
Aquí tienes otro enfoque con menos bucles:
fuente
También podría considerar esta solución, esto
function
devuelve la diferencia mensual en número entero o númeroPasar la fecha de inicio como la primera o la última
param
es tolerante a fallas. Es decir, la función aún devolvería el mismo valor.fuente
Calcular la diferencia entre dos fechas incluye fracción de mes (días).
fuente
Esto debería funcionar bien:
fuente
fuente
El siguiente código devuelve meses completos entre dos fechas teniendo en cuenta también el número de días de meses parciales.
fuente
}
fuente
debajo de la lógica obtendrá la diferencia en meses
fuente
fuente
Mira lo que uso:
fuente
fuente
Número de meses cuando el día y la hora no importan
En este caso, no me preocupan los meses completos, los meses parciales, la duración de un mes, etc. Solo necesito saber la cantidad de meses. Un caso relevante en el mundo real sería cuando se debe presentar un informe cada mes, y necesito saber cuántos informes debería haber.
Ejemplo:
Este es un ejemplo de código elaborado para mostrar a dónde van los números.
Tomemos 2 marcas de tiempo que deberían resultar en 4 meses
Puede ser ligeramente diferente con su zona horaria / hora extraída. El día, los minutos y los segundos no importan y pueden incluirse en la marca de tiempo, pero lo ignoraremos con nuestro cálculo real.
Paso 1: convierta la marca de tiempo a una fecha de JavaScript
Paso 2: obtenga valores enteros para los meses / años
Esto nos da
Paso 3: Agregar
(12 * (endYear - startYear)) + 1
al mes final.2 + (12 * (2020 - 2019)) + 1 = 15
Paso 4: resta los meses
15 - 11 = 4
; Obtenemos nuestro resultado de 4 meses.Ejemplo de ejemplo de 29 meses
Noviembre de 2019 hasta marzo de 2022 es de 29 meses. Si los coloca en una hoja de cálculo de Excel, verá 29 filas.
3 + (12 * (2022-2019)) + 1
40-11 = 29
fuente
fuente
Un enfoque sería escribir un servicio web Java simple (REST / JSON) que use la biblioteca JODA
http://joda-time.sourceforge.net/faq.html#datediff
para calcular la diferencia entre dos fechas y llamar a ese servicio desde javascript.
Esto supone que su back-end está en Java.
fuente