2008-09-03 28 views
90

Estoy creando una aplicación que le permite definir eventos con un marco de tiempo. Quiero completar automáticamente la fecha de finalización cuando el usuario selecciona o cambia la fecha de inicio. Sin embargo, no puedo entender cómo obtener la diferencia entre las dos veces y cómo crear una nueva Fecha de finalización usando esa diferencia.¿Cómo obtengo la diferencia entre dos fechas en JavaScript?

+0

duplicado posible de [Comparar dos fechas con JavaScript] (https://stackoverflow.com/questions/492994/compare -two-dates-with-javascript) –

Respuesta

63

En JavaScript, las fechas se pueden transformar en el número de milisegundos desde el epoc llamando al método getTime()o simplemente usando la fecha en una expresión numérica.

Para obtener la diferencia, solo resta las dos fechas.

Para crear una nueva fecha basada en la diferencia, solo pase el número de milisegundos en el constructor.

var oldBegin = ... 
var oldEnd = ... 
var newBegin = ... 

var newEnd = new Date(newBegin + oldEnd - oldBegin); 

Esto sólo debe trabajar

EDITAR: Solución de error señalado por @bdukes

EDIT:

Para una explicación de la conducta, oldBegin, oldEnd y newBegin son Date instancias. Llamar a los operadores + y - activará el autoenlace de Javascript y llamará automáticamente al método prototipo valueOf() de esos objetos. Sucede que el método valueOf() se implementa en el objeto Date como una llamada al getTime().

Así que, básicamente: date.getTime() === date.valueOf() === (0 + date) === (+date)

+7

Respuesta no suficientemente clara. ¿Cómo aplicar 'getTime()'? – Gruber

+2

¿Has probado date.getTime()? –

+0

¿Cuál es el formato requerido para .getTime() para funcionar ... Por ejemplo, nueva Fecha ('22 -12-2012 00:00 '). GetTime() no funcionará ... ¿Alguna idea? – Jimmyt1988

0

Si utiliza objetos Date y luego utiliza la función getTime() para ambas fechas se le dará a sus respectivos tiempos desde ene 1 de 1970 en un valor numérico. A continuación, puede obtener la diferencia entre estos números.

Si eso no le ayuda a cabo, echa un vistazo a la documentación completa: http://www.w3schools.com/jsref/jsref_obj_date.asp

+2

No creo que hacer referencia a w3schools.com sea demasiado bueno: http://w3fools.com/ –

+0

Oh, sí, no lo noté, las respuestas debajo de esta son como mucho medio año . –

4

Si no se preocupan por el componente de tiempo, puede utilizar .getDate() y .setDate() que acaba de establecer la parte de fecha.

Así que para establecer la fecha de finalización a 2 semanas después de la fecha de inicio, hacer 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, hacer esto:

function GetDateDiff(startDate, endDate) 
{ 
    return endDate.getDate() - startDate.getDate(); 
} 

por último, vamos a modificar la primera función por lo que puede tomar el valor devuelto por segundo como un parámetro:

function GetEndDate(startDate, days) 
{ 
    var endDate = new Date(startDate.getTime()); 
    endDate.setDate(endDate.getDate() + days); 
    return endDate; 
} 
+29

'GetDateDiff()' romperá las barreras de mes. Por ejemplo, 2011/04/26 y 2011/05/01 devolverá -25, pero el desplazamiento debe ser de 5 días. – nfm

+0

var ds = new Fecha (2014, 0, 31, 0, 0, 0, 0); var de = new Fecha (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) return 0 – Noor

3

Gracias s @Vincent Robert, terminé usando su 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)); 
    } 
+1

Es bueno explicar por qué algunas veces usa 'getTime' y otras veces no – Dan

0
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') 
} 
0

este código llena la duración de años de estudio cuando se introduce la fecha de inicio y de finalización (calificar fecha accured) de estudio y comprobar si la duración de menos de un año si Si la alerta un mensaje tomar en cuenta que hay tres elementos de entrada y el primer txtFromQualifDate segundo y tercero txtQualifDatetxtStudyYears

se mostrará resultado de varios años con la 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; 
     } 
    } 
+1

Nunca analice las cadenas de fechas para encontrar el año porque la apariencia de la cadena (especialmente los separadores) difiere entre los navegadores. Use 'getFullYear' que fue diseñado para eso. ------- Ver la biblioteca de datejs en googlecode que posiblemente admite la mayoría de los casos de esquina – Dan

+0

gracias por su consejo @Dan, pero funcionó y probó para mí en el proyecto de gobierno real (diferentes navegadores) ¿es esa programación débil la práctica? :) – shareef

2

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)); 
} 
+1

Colóquelo en una llamada 'Math.abs()', y siempre obtendrá un decimal positivo. –

+1

Buena sugerencia Koen. Eso le da a la gente 2 opciones: solo la diferencia de fecha verdadera que sugirió, o una fecha con el signo que indica si la diferencia está en el pasado o en el futuro. :) – Spider

+0

Tenga en cuenta que en JavaScript también puede agregar/sustraer un número en milisegundos a 'date.getTime()' para obtener el tiempo en el futuro/pasado. 'var nextMinute = new Date (someDate.getTime() + 60 * 1000); – Dan

18

JavaScript soporta perfectamente diferencia de fechas fuera de la caja

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); 

Así que si usted tiene riesgo de la adición de un número y fecha, convertir Fecha de number directamente.

console.log(a.getTime() - 10); 
console.log(a.getTime() + 10); 

Mi ejemplo puño demuestra el poder del objeto Date, pero en realidad parece ser una bomba de tiempo

+0

Dan, su ejemplo me pareció el más fácil de entender y seguir. Gracias. – Melanie

+4

Las "trampas" son en realidad valores predeterminados basados ​​en la especificación del idioma. El operador de resta '-' coacciona los argumentos al número, por lo que la fecha devuelve su valor de tiempo. El operador '+' está sobrecargado, por lo tanto, podría agregarse, aplicar coerción al número o concatenación. Como Dates fuerza a Cadena en este caso, '+' hace concatenación. La confusión no es culpa del objeto Date, sino de operadores sobrecargados. – RobG

1
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); 
} 
5

See JsFiddle DEMO

var date1 = new Date();  
    var date2 = new Date("2015/07/30 21:59:00"); 
    showDiff(); 

function showDiff(date1, date2){ 

    var diff = (date2 - date1)/1000; 
    var 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> 
0

modificitaion alternativa extendió código ..

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); 
} 
+0

Agregue más aclaraciones a su respuesta y use un mejor inglés. –

+0

Esta solución es incorrecta porque usa 365 días, sin tener en cuenta los años bisiestos. –

0
<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> 
2

Si se utiliza moment.js, hay una solución más simple, lo que le dará la diferencia en días en una sola línea de código.

moment(endDate).diff(moment(beginDate), 'days'); 

detalles adicionales se pueden encontrar en el moment.js page

Cheers, Miguel

Cuestiones relacionadas