¿Cómo obtengo el número de días entre dos fechas en JavaScript? Por ejemplo, dadas dos fechas en cuadros de entrada:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
javascript
date
Michael Haren
fuente
fuente
Respuestas:
Aquí hay una implementación rápida y sucia de
datediff
, como prueba de concepto para resolver el problema tal como se presenta en la pregunta. Se basa en el hecho de que puede obtener los milisegundos transcurridos entre dos fechas restándolos, lo que los obliga a su valor numérico primitivo (milisegundos desde el comienzo de 1970).Debe tener en cuenta que las API de fecha "normales" (sin "UTC" en el nombre) operan en la zona horaria local del navegador del usuario, por lo que, en general, podría tener problemas si su usuario se encuentra en una zona horaria que usted no esperar, y su código tendrá que lidiar con las transiciones de horario de verano. Debe leer detenidamente la documentación del objeto Date y sus métodos, y para cualquier cosa más complicada, considere usar una biblioteca que ofrezca API más seguras y potentes para la manipulación de fechas.
Date
- Referencia de JavaScript de MDNAdemás, con fines ilustrativos, el fragmento utiliza acceso con nombre en el
window
objeto por brevedad, pero en la producción debe usar API estandarizadas como getElementById , o más probablemente, algún marco de interfaz de usuario.fuente
parseDate
método para que sea:return new Date(mdy[2], mdy[1], mdy[0]-1);
Al escribir estas líneas, solo una de las otras respuestas maneja correctamente las transiciones DST (horario de verano). Aquí están los resultados en un sistema ubicado en California:
Aunque
Math.round
devuelve los resultados correctos, creo que es algo torpe. En cambio, al contabilizar explícitamente los cambios en el desplazamiento UTC cuando comienza o termina el horario de verano, podemos usar la aritmética exacta:Explicación
Los cálculos de fecha de JavaScript son complicados porque los
Date
objetos almacenan las horas internamente en UTC, no en la hora local. Por ejemplo, 3/10/2013 12:00 AM Hora estándar del Pacífico (UTC-08: 00) se almacena como 3/10/2013 8:00 AM UTC, y 3/11/2013 12:00 AM Hora del Pacífico ( UTC-07: 00) se almacena como 3/11/2013 7:00 AM UTC. ¡En este día, la medianoche a medianoche hora local es solo 23 horas en UTC!Aunque un día en la hora local puede tener más o menos de 24 horas, un día en UTC siempre es exactamente 24 horas. 1 El
daysBetween
método que se muestra arriba aprovecha este hecho al llamar primerotreatAsUTC
para ajustar ambas horas locales a la medianoche UTC, antes de restar y dividir.1. JavaScript ignora los segundos bisiestos.
fuente
Date.UTC(...)
en primer lugar.La forma más fácil de obtener la diferencia entre dos fechas:
Obtiene los días de diferencia (o NaN si no se pudo analizar uno o ambos). La fecha de análisis dio el resultado en milisegundos y para obtenerlo por día, debe dividirlo entre 24 * 60 * 60 * 1000
Si desea dividirlo por días, horas, minutos, segundos y milisegundos:
Aquí está mi versión refactorizada de la versión de James:
fuente
Recomiendo usar la biblioteca moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Maneja el horario de verano correctamente y, en general, es excelente para trabajar.
Ejemplo:
fuente
end.diff(start,"days")
aunque el código tal como está escrito funcionará porque la fecha de inicio es posterior a la fecha de finalización!Continuaría y tomaría esta pequeña utilidad y en ella encontrarás funciones para esto. Aquí hay un pequeño ejemplo:
fuente
Actualización: Sé que esto no es parte de sus preguntas, pero en general no recomendaría hacer ningún cálculo o manipulación de la fecha en JavaScript vainilla y más bien usar una biblioteca como date- fns o moment.js debido a muchos casos extremos .
fuente
timeDiff
regresado en negativo? No debetimeDiff
ser(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Usando Moment.js
fuente
var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays);
más aquí: momentjs.comLos valores de fecha en JS son valores de fecha y hora.
Entonces, los cálculos de fecha directa son inconsistentes:
Por ejemplo, necesitamos convertir la segunda fecha:
El método podría ser truncar los molinos en ambas fechas:
fuente
Es mejor deshacerse de DST, Math.ceil, Math.floor, etc. utilizando los horarios UTC:
Este ejemplo da la diferencia de 109 días.
24*60*60*1000
Es un día en milisegundos.fuente
Para calcular los días entre 2 fechas dadas, puede usar el siguiente código: las fechas que uso aquí son 01 de enero de 2016 y 31 de diciembre de 2016
fuente
Es posible calcular una diferencia de días de prueba completa entre dos fechas que descansan en diferentes ZT utilizando la siguiente fórmula:
fuente
Encontré esta pregunta cuando quiero hacer un cálculo en dos fechas, pero la fecha tiene un valor de horas y minutos, modifiqué la respuesta de @ michael-liu para que se ajustara a mis requisitos, y pasó mi prueba.
días de diferencia
2012-12-31 23:00
y2013-01-01 01:00
debe ser igual a 1. (2 horas) días de diferencia2012-12-31 01:00
y2013-01-01 23:00
debe ser igual a 1. (46 horas)fuente
Ejemplo de jsfiddle :)
fuente
Creo que las soluciones no son correctas al 100%. Usaría ceil en lugar de piso , redondo funcionará pero no es la operación correcta.
fuente
¿Qué pasa con el uso de formatDate del widget DatePicker? Puede usarlo para convertir las fechas en formato de marca de tiempo (milisegundos desde el 01/01/1970) y luego hacer una simple resta.
fuente
fuente
Puede que esta no sea la solución más elegante, pero parece responder a la pregunta con un código relativamente simple, creo. ¿No puedes usar algo como esto?
Esto supone que está pasando objetos de fecha como parámetros.
fuente
Si tiene dos marcas de tiempo de Unix, puede usar esta función (hecho un poco más detallado para mayor claridad):
Ejemplo:
fuente
Tenga cuidado al usar milisegundos .
El date.getTime () devuelve milisegundos y hacer la operación matemática con milisegundos requiere para incluir
El ejemplo del comentario anterior es la mejor solución que encontré hasta ahora https://stackoverflow.com/a/11252167/2091095 . Pero use +1 a su resultado si desea contar todos los días involucrados.
fuente
fuente
Tuve el mismo problema en Angular. Hago la copia porque, de lo contrario, sobrescribirá la primera fecha. Ambas fechas deben tener hora 00:00:00 (obviamente)
fuente
Utilicé el siguiente código para experimentar la funcionalidad de fecha de publicación para una publicación de noticias. Calculo el minuto, la hora, el día o el año en función de la fecha de publicación y la fecha actual.
fuente
si quieres tener un DateArray con fechas prueba esto:
DebugSnippet
fuente
La manera simple de calcular los días entre dos fechas es eliminar ambos componentes de tiempo, es decir, establecer las horas, minutos, segundos y milisegundos a 0 y luego restar su tiempo y sumergirlo en milisegundos por valor de un día.
fuente
new Date
fuente
Sencillo, fácil y sofisticado. Esta función se llamará cada 1 segundo para actualizar el tiempo.
fuente
Una mejor solución por
devolverá 0 si ambas fechas son iguales.
fuente
Una contribución, para la fecha anterior al 1970-01-01 y posterior al 2038-01-19
fuente
fuente
Puede usar UnderscoreJS para formatear y calcular la diferencia.
Demo https://jsfiddle.net/sumitridhal/8sv94msp/
fuente