2009-04-23 10 views
7

Existe-t-il quelque chose de facilement disponible en JavaScript (ie pas via "plugins") qui me permette de faire quelque chose comme setTimeout, mais au lieu de dire en combien de millisecondes quelque chose devrait arriver, je lui donne une date objet qui dit quand faire quelque chose?setTimeout mais pour un temps donné

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

Et oui, je sais que je peux le faire simplement en soustrayant new Date() avec mon objet date existante (ou peut-être est l'inverse) pour obtenir la quantité de millisecondes, mais je voudrais encore savoir.

Répondre

17

Vous devez simplement trouver le nombre de millisecondes entre maintenant et votre objet date.

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

ne devez-vous pas multiplier par 1000 pour obtenir les milisecondes? –

+1

@Pim, non vous. 'getTime()' renvoie le nombre de millisecondes entre 00:00:00 1/1/1970 et l'objet de date correspondant. – James

+0

AH ok, je pensais que c'était en quelques secondes. –

6

Non, mais vous pouvez facilement écrire votre propre fonction. Calculez simplement la différence entre maintenant et le moment donné en millisecondes et appelez setTimeout avec cela.

Quelque chose comme ceci:

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

EDIT: suppression de la multiplication supplémentaire par 1000, grâce chris pour cette remarque!

+0

Cela est faux, getTime renvoie déjà des millisecondes. – Chris

+0

Vous êtes les bienvenus! Merci pour la réparation. – Chris

3

Puisque les gens parlent de calcul des intervalles de temps mort à l'aide date objets, il convient de noter que, dans Firefox, la valeur maximale setTimeout() accepte pour le paramètre intervalle est 2147483647 (2^31-1) comme PRIntervalTime est un entier signé de 32 bits. Cela sort à moins de 25 jours.

Questions connexes