2009-04-23 7 views
7

¿Hay algo disponible en JavaScript (es decir, no a través de "complementos") que me permita hacer algo como setTimeout, pero en lugar de decir en cuántos milisegundos debería pasar algo, le doy una fecha ¿Qué objeto le dice cuándo hacer algo?setTimeout pero por un tiempo determinado

setToHappen(function() { 
    alert('Wake up!'); 
}, new Date("...")); 

Y sí, sé que puedo hacer esto simplemente restando new Date() con mi objeto de fecha existente (o tal vez es al revés) para obtener la cantidad de milisegundos, pero todavía me gustaría saber.

Respuesta

17

Tendría que encontrar el número de milisegundos entre ahora y su objeto de fecha.

function setToHappen(fn, d){ 
    var t = d.getTime() - (new Date()).getTime(); 
    return setTimeout(fn, t); 
} 
+1

¿no tienes que multiplicar por 1000 para obtener los milisegundos? –

+1

@Pim, no, no. 'getTime()' devuelve la cantidad de milisegundos entre 00:00:00 1/1/1970 y el objeto de fecha correspondiente. – James

+0

AH bien, pensé que era en segundos. –

6

No, pero podría escribir fácilmente su propia función. Simplemente calcule la diferencia entre ahora y el momento dado en milisegundos y llame a setTimeout con eso.

Algo como esto:

setToHappen = function(fn, date){ 
    var now = new Date().getTime(); 
    var diff = date.getTime() - now; 
    return setTimeout(fn, diff); 
} 

EDIT: elimina la multiplicación adicional en 1000, gracias a Chris por señalarlo!

+0

Esto está mal, getTime ya devuelve milisegundos. – Chris

+0

¡De nada! Gracias por arreglarlo – Chris

3

Dado que las personas están hablando de cálculo de los intervalos de tiempo de espera utilizando date objetos, hay que señalar que, en Firefox, el valor máximo setTimeout() aceptará para el parámetro de intervalo es 2147483647 (2^31 - 1) como PRIntervalTime es un entero de 32 bits con signo. Eso sale a poco menos de 25 días.

Cuestiones relacionadas