¿Cómo obtengo la diferencia entre dos fechas en JavaScript?
-
09-06-2019 - |
Pregunta
Estoy creando una aplicación que te permite definir eventos con un marco de tiempo.Quiero completar automáticamente la fecha de finalización cuando el usuario seleccione o cambie la fecha de inicio.Sin embargo, no puedo entender cómo obtener la diferencia entre las dos horas y luego cómo crear una nueva fecha de finalización usando esa diferencia.
Solución
En JavaScript, las fechas se pueden transformar al número de milisegundos desde la epoc llamando al getTime()
método o simplemente usando la fecha en una expresión numérica.
Entonces, para obtener la diferencia, simplemente resta las dos fechas.
Para crear una nueva fecha basada en la diferencia, simplemente pase la cantidad de milisegundos en el constructor.
var oldBegin = ...
var oldEnd = ...
var newBegin = ...
var newEnd = new Date(newBegin + oldEnd - oldBegin);
Esto debería funcionar
EDITAR:Error solucionado señalado por @bdukes
EDITAR:
Para una explicación del comportamiento, oldBegin
, oldEnd
, y newBegin
son Date
instancias.Llamando a operadores +
y -
activará la conversión automática de Javascript y llamará automáticamente al valueOf()
método prototipo de esos objetos.Sucede que el valueOf()
El método se implementa en el Date
objeto como una llamada a getTime()
.
Así que básicamente: date.getTime() === date.valueOf() === (0 + date) === (+date)
Otros consejos
JavaScript admite perfectamente la diferencia de fechas desde el primer momento
var msMinute = 60*1000,
msDay = 60*60*24*1000,
a = new Date(2012, 2, 12, 23, 59, 59),
b = new Date("2013 march 12");
console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');
Ahora algunas trampas.Prueba esto:
console.log(a - 10);
console.log(a + 10);
Entonces, si corre el riesgo de agregar un número y una fecha, convierta la fecha a number
directamente.
console.log(a.getTime() - 10);
console.log(a.getTime() + 10);
Mi primer ejemplo demuestra el poder del objeto Date, pero en realidad parece ser una bomba de tiempo.
var date1 = new Date();
var date2 = new Date("2025/07/30 21:59:00");
//Customise date2 for your required future time
showDiff();
function showDiff(date1, date2){
var diff = (date2 - date1)/1000;
diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";
setTimeout(showDiff,1000);
}
para su código HTML:
<div id="showTime"></div>
Si no le importa el componente de tiempo, puede usar .getDate()
y .setDate()
para simplemente configurar la parte de la fecha.
Entonces, para establecer su fecha de finalización en 2 semanas después de su fecha de inicio, haga algo como esto:
function GetEndDate(startDate)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate()+14);
return endDate;
}
Para devolver la diferencia (en días) entre dos fechas, haga esto:
function GetDateDiff(startDate, endDate)
{
return endDate.getDate() - startDate.getDate();
}
Finalmente, modifiquemos la primera función para que pueda tomar el valor devuelto por la segunda como parámetro:
function GetEndDate(startDate, days)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate() + days);
return endDate;
}
Gracias @Vicente Roberto, Terminé usando tu ejemplo básico, aunque en realidad es newBegin + oldEnd - oldBegin
.Aquí está la solución final simplificada:
// don't update end date if there's already an end date but not an old start date
if (!oldEnd || oldBegin) {
var selectedDateSpan = 1800000; // 30 minutes
if (oldEnd) {
selectedDateSpan = oldEnd - oldBegin;
}
newEnd = new Date(newBegin.getTime() + selectedDateSpan));
}
Dependiendo de sus necesidades, esta función calculará la diferencia entre los 2 días y devolverá un resultado en días decimales.
// This one returns a signed decimal. The sign indicates past or future.
this.getDateDiff = function(date1, date2) {
return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}
// This one always returns a positive decimal. (Suggested by Koen below)
this.getDateDiff = function(date1, date2) {
return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}
Si usas moment.js, existe una solución más sencilla, que te dará la diferencia en días en una sola línea de código.
moment(endDate).diff(moment(beginDate), 'days');
Se pueden encontrar detalles adicionales en el página momento.js
Saludos, Miguel
function compare()
{
var end_actual_time = $('#date3').val();
start_actual_time = new Date();
end_actual_time = new Date(end_actual_time);
var diff = end_actual_time-start_actual_time;
var diffSeconds = diff/1000;
var HH = Math.floor(diffSeconds/3600);
var MM = Math.floor(diffSeconds%3600)/60;
var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
getTime(diffSeconds);
}
function getTime(seconds) {
var days = Math.floor(leftover / 86400);
//how many seconds are left
leftover = leftover - (days * 86400);
//how many full hours fits in the amount of leftover seconds
var hours = Math.floor(leftover / 3600);
//how many seconds are left
leftover = leftover - (hours * 3600);
//how many minutes fits in the amount of leftover seconds
var minutes = leftover / 60;
//how many seconds are left
//leftover = leftover - (minutes * 60);
alert(days + ':' + hours + ':' + minutes);
}
function checkdate() {
var indate = new Date()
indate.setDate(dat)
indate.setMonth(mon - 1)
indate.setFullYear(year)
var one_day = 1000 * 60 * 60 * 24
var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
var str = diff + " days are remaining.."
document.getElementById('print').innerHTML = str.fontcolor('blue')
}
Código extendido de modificación alternativa.
showDiff();
function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");
var date2 = new Date();
//Customise date2 for your required future time
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;
var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;
var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";
setTimeout(showDiff,1000);
}
<html>
<head>
<script>
function dayDiff()
{
var start = document.getElementById("datepicker").value;
var end= document.getElementById("date_picker").value;
var oneDay = 24*60*60*1000;
var firstDate = new Date(start);
var secondDate = new Date(end);
var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
document.getElementById("leave").value =diffDays ;
}
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>
Este código llena la duración de los años de estudio cuando ingresa la fecha de inicio y la fecha de finalización (fecha de calificación con accesorios) de estudio y verifique si la duración menor de un año en caso afirmativo, en caso de que la alerta tenga en cuenta, hay tres elementos de entrada los primeros. txtFromQualifDate
y segundo txtQualifDate
y tercero txtStudyYears
Mostrará el resultado del número de años con fracción.
function getStudyYears()
{
if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
{
var d1 = document.getElementById('txtFromQualifDate').value;
var d2 = document.getElementById('txtQualifDate').value;
var one_day=1000*60*60*24;
var x = d1.split("/");
var y = d2.split("/");
var date1=new Date(x[2],(x[1]-1),x[0]);
var date2=new Date(y[2],(y[1]-1),y[0])
var dDays = (date2.getTime()-date1.getTime())/one_day;
if(dDays < 365)
{
alert("the date between start study and graduate must not be less than a year !");
document.getElementById('txtQualifDate').value = "";
document.getElementById('txtStudyYears').value = "";
return ;
}
var dMonths = Math.ceil(dDays / 30);
var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;
document.getElementById('txtStudyYears').value = dYears;
}
}
Si usa objetos Date y luego usa el getTime()
función para ambas fechas le dará sus respectivas horas desde el 1 de enero de 1970 en un valor numérico.Luego puede obtener la diferencia entre estos números.
Si eso no te ayuda, consulta la documentación completa: http://www.w3schools.com/jsref/jsref_obj_date.asp
El siguiente código devolverá los días que quedan desde hoy hasta la fecha futura.
Dependencias: jQuery y MomentJs.
var getDaysLeft = function (date) {
var today = new Date();
var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);
return daysLeft;
};
getDaysLeft('YYYY-MM-DD');
var getDaysLeft = function (date1, date2) {
var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);
return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);
ESTO ES LO QUE HICE EN MI SISTEMA.
var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);