¿Cuántos segundos hay entre dos fechas?

180

Entonces tengo dos fechas YYYY-MM-DDyZZZZ-NN-EE

¿Cómo puedo saber cuántos segundos hay entre ellos?

Steven
fuente
173
Intento dejar al menos media hora entre fechas para evitar que me atrapen.
Don Branson el
yyyy-MM-ddestá claro (año, mes, día, tenga en cuenta que no todos están en mayúsculas), pero ZZZZ-NN-EE no es así. Lo interpreto como (zona horaria, ???, día a la semana). ¿Es semana en año? Si es así, eso hubiera sido ww. Pero aún así, también necesitamos el año para calcular la diferencia. ¿Puede dar algunos de los valores de muestra reales?
BalusC
77
@BalusC: Creo que simplemente pasó a las siguientes letras para indicar una segunda fecha (Y -> Z, M -> N y D -> E). Usar nombres de variables como startDate y endDate probablemente hubiera sido mejor.
Austin Salonen
Ah, ya veo. De hecho, esto podría haberse pedido mucho más claro.
BalusC

Respuestas:

242

Estoy tomando YYYY & ZZZZ para significar valores enteros que significan el año, MM & NN para significar valores enteros que significan el mes del año y DD & EE como valores enteros que significan el día del mes.

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

Una fuente útil para futuras referencias es el sitio MDN

Alternativamente, si sus fechas vienen en un formato, JavaScript puede analizar

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

y luego puede usar ese valor como la diferencia en milisegundos (dif en ambos ejemplos tiene el mismo significado)

Martín
fuente
1
Solo los patrones utilizados en el ejemplo no son tan correctos. Los años de 4 dígitos se indican en minúsculas yyyy, los meses de 2 dígitos en mayúsculas MMy los días de 2 dígitos en minúsculas dd.
BalusC
1
Martin, tengo la impresión de que no estaba usando ningún patrón de fecha aquí. MM DD, AAAA y NN EE, ZZZZ son en realidad los "valores de ejemplo" que Steven preguntó. En otras palabras, no está haciendo ningún tipo de formateo.
Wagner Silveira
He actualizado el segundo ejemplo, que es por lo que creo que todos se estaban confundiendo. También he agregado un poco de aclaración sobre cómo interpreto exactamente los valores dados en su ejemplo.
Martin
Su segunda variable necesita ser llamada t2.
Kees C. Bakker
En la mayoría de los casos, probablemente estará haciendo t2 - t1, no t1 - t2
UpTheCreek
83

Solo resta:

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

alert("You waited: " + difference + " seconds");
Seth
fuente
@ user3344977 - ¡entonces está pasando algo gracioso! Verifique los valores de ay by asegúrese de que sean fechas.
Seth
@Seth tienes razón, así que eliminé mi comentario ... una de mis "fechas" era en realidad una cadena. Esto funciona a la perfección.
user3344977
14

Si una o ambas fechas están en el futuro, me temo que eres SOL si quieres precisión al segundo. El tiempo UTC tiene segundos bisiestos que no se conocen hasta aproximadamente 6 meses antes de que sucedan, por lo que cualquier fecha posterior puede ser imprecisa en algunos segundos (y en la práctica, dado que las personas no actualizan sus máquinas con tanta frecuencia, usted puede encontrar que cualquier momento en el futuro está apagado por una cierta cantidad de segundos).

Esto proporciona una buena explicación de la teoría del diseño de bibliotecas de fecha / hora y por qué es así: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs

rmeador
fuente
77
¡+1 por mencionar el segundo problema! Es muy frustrante cuando esto se maneja mal, incluso por personas que deberían saber mejor (comité POSIX, te estoy mirando ...)
Jim Lewis
1
Vale la pena mencionar que el estándar ECMA ignora explícitamente los segundos bisiestos (es decir: incluso los segundos bisiestos pasados ): en los valores de tiempo, los segundos bisiestos se ignoran. Se supone que hay exactamente 86,400,000 milisegundos por día .
Sylvain Leroux
11

Puedes hacerlo simplemente.

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);

fuente
4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);
Justin Johnson
fuente
0

Manera fácil:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));
Fernando Pie
fuente
-3

En bash:

bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

Requiere tener instalados bc y gnu date.

Alex G
fuente
1
¿Cómo es esto relevante?
Abandono el
-10

.Net proporciona la clase TimeSpan para hacer los cálculos por usted.

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds
Jeff.Crossett
fuente
@Jeff, es posible que desee eliminar esta respuesta para no perder puntos. Pidieron el código fuente de JavaScript, en lugar del código fuente de Visual Basic.
MacGyver