JavaScript: comment faire quelque chose à chaque heure?

Je veux exécuter un code JS toutes les heures. Mais je ne peux pas utiliser

setInterval("javascript function",60*60*1000); 

Parce que je veux le faire toutes les heures entières, je veux dire à 1:00, à 2:00, à 3:00 et ainsi de suite. Je pense à quelque chose comme

 var d; while(true) { d = new Date(); if ((d.getMinutes() == '00') && (d.getSeconds() == '00')){ // my code here } } 

Mais c'est trop lent et ça ne marche pas bien.

Thak you pour toutes les idées

Je trouverais à quelle heure il est maintenant, découvrez combien de temps il dure jusqu'à la prochaine heure complète, puis attends longtemps. Alors,

 function doSomething() { var d = new Date(), h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours() + 1, 0, 0, 0), e = h - d; if (e > 100) { // some arbitrary time period window.setTimeout(doSomething, e); } // your code } 

La vérification de e < 100 est juste pour vous assurer que vous ne faites pas setTimeout sur quelque chose comme 5 ms et que vous obtenez une boucle folle.

Ce que vous pouvez faire, c'est qu'un intervalle soit exécuté à chaque minute, et vérifiez si l'heure est :00 avant d'exécuter le code actuel.

regarder celui-ci :

 function to_be_executed(){ ... ... ... makeInterval(); } function makeInterval(){ var d = new Date(); var min = d.getMinutes(); var sec = d.getSeconds(); if((min == '00') && (sec == '00')) to_be_executed(); else setTimeout(to_be_executed,(60*(60-min)+(60-sec))*1000); } 

Vous pouvez le faire en effaçant et en définissant l'intervalle à chaque fois. C'est exactement la première fois, à la place de l'intervalle d'une heure, il serait une heure moins les minutes et les secondes actuelles:

 var d = new Date(); var secondsPastHour = d.getMinutes()*60 + d.getSeconds(); var intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 ); function myFn() { // do stuff // ... clearInterval( intervalId ); intervalId = setInterval( myFn, 60*60*1000 ); } 

Le seul problème avec cela est que, finalement, il commencera probablement à dériver … la solution serait de faire la même chose à l'intérieur de la fonction que vous le faites en la lançant:

 var d = new Date(); var secondsPastHour = d.getMinutes()*60 + d.getSeconds(); var intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 ); function myFn() { // do stuff // ... clearInterval( intervalId ); var d = new Date(); var secondsPastHour = d.getMinutes()*60 + d.getSeconds(); intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 ); } 

Voici une preuve de concept qui se met à jour chaque minute (je ne voulais pas attendre une heure entière pour tester mon code!): http://jsfiddle.net/dRsua/

Une façon simple serait de contrôler continuellement un contrôle pour détecter quand l'heure change:

 var lastProcessedHour = -1; setInterval(function() { var d = new Date(); var currentHour = d.getHours(); if (currentHour != lastProcessedHour) { // do stuff console.log("new hour"); lastProcessedHour = currentHour; } }, 1000); 

Si vous l'exécutez chaque seconde comme ci-dessus, le script déclenchera une seconde dans la nouvelle heure au plus tard.

Je pense que cette méthode est à la fois robuste et facile à comprendre, et du point de vue de la performance, il devrait vraiment y avoir un problème pour exécuter ce contrôle simple une fois par seconde.

Vous devez exécuter une fonction setInterval chaque minute (ou chaque seconde selon la précision à laquelle vous voulez que votre minuterie soit) et exécuter votre code lorsque les minutes sont nulles (btw get minutes renvoie un nombre compris entre 0 et 59).

  function myTimer() { var d = new Date() if (d.getMinutes() == 0) { console.log("full hour"); } } timer = setInterval(function(){myTimer()},60000) 

Si vous ne voulez pas avoir un intervalle en cours d'exécution à chaque seconde / minute après avoir établi que vous êtes en pleine heure, vous pouvez simplement déclencher un nouvel intervalle horaire et effacer le premier.

 var myHourlyTimer = null; function myTimer() { var d = new Date() if (d.getMinutes() == 0) { console.log("full hour"); myHourlyTimer = setInterval(function(){myHourlyTimerFunction()},3600000); clearInterval(timer) } } timer = setInterval(function(){myTimer()},60000) 

Je cherchais également cela, en fonction de la réponse de Mark, j'ai écrit ceci:

 function callEveryFullHour() { var now = new Date(); var nextHour = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + 1, 0, 0, 0); var difference = nextHour - now; window.setTimeout(function(){ // code goes here console.log("It's a full hour!") callEveryFullHour(); }, difference); }