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.

¿Fue útil?

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.

Ver DEMOSTRACIÓN de JsFiddle

    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.

http://jsfiddle.net/vvGPQ/48/

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top