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?
Respuesta
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)
Respuesta no suficientemente clara. ¿Cómo aplicar 'getTime()'? – Gruber
¿Has probado date.getTime()? –
¿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
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
No creo que hacer referencia a w3schools.com sea demasiado bueno: http://w3fools.com/ –
Oh, sí, no lo noté, las respuestas debajo de esta son como mucho medio año . –
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;
}
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));
}
Es bueno explicar por qué algunas veces usa 'getTime' y otras veces no – Dan
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')
}
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 txtQualifDate
txtStudyYears
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;
}
}
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
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
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));
}
Colóquelo en una llamada 'Math.abs()', y siempre obtendrá un decimal positivo. –
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
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
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
Dan, su ejemplo me pareció el más fácil de entender y seguir. Gracias. – Melanie
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
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);
}
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>
modificitaion alternativa extendió código ..
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);
}
Agregue más aclaraciones a su respuesta y use un mejor inglés. –
Esta solución es incorrecta porque usa 365 días, sin tener en cuenta los años bisiestos. –
<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>
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
- 1. Diferencia entre fechas en JavaScript
- 2. ¿Cómo puedo encontrar la diferencia entre dos fechas usando Javascript
- 3. calcular la diferencia entre dos fechas
- 4. C# - ¿Diferencia entre dos fechas?
- 5. Diferencia entre dos fechas en MySQL
- 6. Calcular la diferencia entre dos fechas en MySQL
- 7. Diferencia entre fechas en dos filas consecutivas
- 8. Diferencia entre dos fechas en Python
- 9. Android diferencia entre dos fechas en segundos
- 10. Diferencia, en minutos, entre dos fechas
- 11. ¿Cómo encuentro la diferencia horaria entre dos fechas en PHP?
- 12. ¿Cómo verifico la diferencia, en segundos, entre dos fechas?
- 13. ¿Cómo obtener la diferencia entre dos fechas redondeadas a horas
- 14. ¿Cómo puedo obtener la diferencia entre dos fechas bajo bash
- 15. Calcula la diferencia entre dos fechas en PHP
- 16. Diferencia de días entre dos fechas
- 17. ¿cómo obtengo la diferencia entre dos listas con nombre R?
- 18. encuentra la diferencia entre dos fechas en segundos
- 19. Ruby, Rails y la diferencia entre dos fechas
- 20. Diferencia en el tiempo entre dos fechas en Java
- 21. ¿Cómo encontrar las fechas entre dos fechas especificadas?
- 22. Diferencia entre 2 fechas en SQLite
- 23. ¿Cómo combinar dos fechas en JavaScript?
- 24. Matriz de fechas entre dos fechas
- 25. Shell script para obtener la diferencia en dos fechas
- 26. ¿Cómo puedo obtener la diferencia entre todas las confirmaciones que ocurrieron entre dos fechas con Git?
- 27. ¿Cómo obtengo la diferencia en dos listas en C#?
- 28. ¿Cómo obtengo TimeSpan en minutos con dos fechas?
- 29. ¿Cuántos segundos entre dos fechas?
- 30. Cómo calcular la diferencia entre dos fechas en meses en MySQL
duplicado posible de [Comparar dos fechas con JavaScript] (https://stackoverflow.com/questions/492994/compare -two-dates-with-javascript) –