[JS-PHP] Compte à rebours, via heure du serveur

Eléphant du PHP | 351 Messages

25 oct. 2007, 14:32

Bonjour et me revoila avec une autre question de JS,

J'ai donc un code :

Code : Tout sélectionner

<script type="text/javascript"> var tps = 150 ; var m= 0; var s=0; var disp=""; var idtimer =setInterval('affichetemps()',1000); function affichetemps(){ tps-- ; m = parseInt((tps%3600)/60) ; s = parseInt((tps%3600)%60) ; disp = (m<10 ? "0"+m : m) + ':' + (s<10 ? "0"+s : s) ; document.getElementById('temps').innerHTML= disp; if ((s == 0 && m ==0)) { clearInterval(idtimer); url="http://www.site.com/site/index.php?page=membre&mode=quizz&reponse=nok" Go(url) } } function Go(url) { setTimeout("window.location=url", 500) } </script> <div id='temps'></div>
Qui me permet de faire un compte à rebours de 2mn30 avec une redirection.
Mais ce que je voudrais c'est que ce script affiche donc un compte à rebours jusqu'a minuit à partir de l'heure du serveur et sans faire de redirection, mais juste marquer un texte : En cours...

Pouvez-vous m'aider?

Merci d'avance à tous :P

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 14:52

A priori, il te suffit pour cela de déterminer à l'aide de php en fonction de l'heure du serveur, combien de secondes il reste jusqu'à minuit et renseigner la variable "tps" en conséquence (au lieu du 150 sec. soit 0"2'30)

Tu n'as plus ensuite qu'à modifier la fonction Go() qui effectue la redirection une fois le temps écoulé pour qu'elle fasse ce que bon te semble ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

25 oct. 2007, 15:06

Tu as raison, et j'ai déjà du mal pour récupérer le nombres de secondes jusqu'a minuit, tu sait comment faire?

ViPHP
ViPHP | 2287 Messages

25 oct. 2007, 16:01

Tu as raison, et j'ai déjà du mal pour récupérer le nombres de secondes jusqu'a minuit, tu sait comment faire?
Oui il sait ;-) Et pour que tu saches le faire toi aussi :

Combien y a t-il de secondes dans une minute ? 60.
$min=60;
Combien y a t-il de minutes dans une heure ? 60.
$heure=60*$min;
Combien y a t-il d'heures dans une journée ? 24.
$journee=24*$heure;
Une journée contient donc 24*60*60=86400 secondes.

C'est là que ça se complique un peu. On a en php grâce à la fonction time() la possibilité d'avoir le nombre de secondes écoulées depuis un repère fixe dans le temps (qu'on appelle EPOCH), le 1er janvier 1970 à minuit. C'est un nombre entier qui représente à lui tout seul la date et l'heure exacte à la seconde près.

On va se servir de cette valeur pour savoir à combien de secondes on en est de la journée, en se servant de l'opérateur modulo (%), ou reste de la division entière.
$repere=(time())%86400; // $repere contient le nombre de secondes écoulées DEPUIS minuit
Pour avoir le nombre de secondes restantes jusqu'à minuit maintenant, c'est tout simplement le nombre de secondes total de la journée moins le nombre de secondes écoulées dans la journée en cours qu'on vient de calculer :-) .
$compteur=86400-$repere; // Il te reste $compteur secondes avant minuit, Cendrillon !
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 16:30

Bah en fait moi j'aurais généré un timestamp de l'heure actuelle et de l'heure qu'il sera à minuit avec mktime() et fait une simple différence, mais ça marche aussi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

25 oct. 2007, 17:21

Bonjour,

voici ce que j'ai mis :

Code : Tout sélectionner

<script type="text/javascript"> <?php $min=60; $heure=60*$min; $journee=24*$heure; $repere=(time())%86400; $compteur=86400-$repere; ?> var tps = <?php echo $compteur;?> ; var m= 0; var s=0; var disp=""; var idtimer2 =setInterval('affichetemps2()',1000); function affichetemps2(){ tps-- ; m = parseInt((tps%3600)/60) ; s = parseInt((tps%3600)%60) ; disp = (m<10 ? "0"+m : m) + ':' + (s<10 ? "0"+s : s) ; <?php if ($_GET['mode'] == 'eurocarottes') {echo "document.getElementById('temps').innerHTML= disp;";}?> if ((s == 0 && m ==0)) { clearInterval(idtimer2); url="http://www.site.com/site/index.php?page=membre&mode=quizz&reponse=nok" Go2(url) } } function Go2(url) { setTimeout("window.location=url", 500) } </script>
Mais il y a un soucis l'heure ne s'affiche pas.

PS : Ryle, pour mktime(), j'ai essayé mais quand la date n'est pas encore atteinte, rien ne s'affiche, peut etre une erreur de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 19:09

D'après ton code, ton temps ne s'affichera que si i$_GET['mode']=='eurocarottes' (et si tu as bien un conteneur - p, span, div, .. - dont l'id est "temps"), est-ce bien le cas ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

25 oct. 2007, 19:11

Oui, oui tout est bien là. C'et juste que je croit qu'il manque un truc dans le code JS pour que les heures s'affiche mais je ne sait pas comme faire.

Eléphant du PHP | 351 Messages

26 oct. 2007, 14:13

Personne peut m'aider?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2007, 14:34

Bah difficile sans plus d'infos...

Y a-t-il des erreurs js ?
As-tu vérifié dans le source de ta page la valeur de tps ?
ta page contient elle bien un bloc dont l'id est 'temps' ?

Tu peux utiliser la fonction alert() pour contrôler des valeurs ou voir quelle portion du code est exécutée (je te recommande dans ce cas un interval plus grand pour pas être submergé de message d'alertes)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

26 oct. 2007, 14:41

Oui, ma page contient bien un bloc avec comme id temps, aucune erreur JS, mais quand on regarde le code :
<script type="text/javascript">
<?php
$min=60;
$heure=60*$min;
$journee=24*$heure;
$repere=(time())%86400;
$compteur=86400-$repere; ?>
var tps = <?php echo $compteur;?> ;
var m= 0;
var s=0;
var disp="";
var idtimer2 =setInterval('affichetemps2()',1000);
function affichetemps2(){

tps-- ;
m = parseInt((tps%3600)/60) ;
s = parseInt((tps%3600)%60) ;
disp = (m<10 ? "0"+m : m) + ':' + (s<10 ? "0"+s : s) ;

<?php if ($_GET['mode'] == 'eurocarottes') {echo "document.getElementById('temps').innerHTML= disp;";}?>

if ((s == 0 && m ==0)) {
clearInterval(idtimer2);
url="http://www.site.com/site/index.php?page ... eponse=nok"
Go2(url)
}
}
function Go2(url) {
setTimeout("window.location=url", 500)
}

</script>
on voit que la partie en rouge calcul le temps en minutes et secondes, et pas en heure, ce qui fait le bug, mais je ne sait pas comment corriger ce soucis.

Merci de votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2007, 16:04

Aaaaaaaaahhhhhhh ..... ces heures là !! :)
(pff moi j'pensais que c'était l'heure sous entendu les minutes/secondes qui n'apparaissaient pas :))

Bon ben c'est normal qu'il ne t'affiche pas les heures, c'est à toi de faire le calcul pour savoir combien il y a d'heure dans ton temps en seconde. Une heure c'est 3600 secondes, donc si tu comptes combien de fois il y a 3600 secondes dans ton tps (avec une simple division), tu auras ton nombre d'heure, à ajouter dans la chaine que tu affiches :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

26 oct. 2007, 16:14

Je dois faire la même chose que pour les minutes?
Si oui, j'ai essayé et ca bug bien. L'heure déconne.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2007, 16:35

Ben non.. pas tout à fait comme pour les minutes... dans un temps en secondes, y a pas le même nombre d'heures que de minutes :)

Pour obtenir les heures, il te faut diviser ton temps en secondes par 3600 (arrondi à l'inférieur)
Pour obtenir les minutes restantes, il te faut diviser les secondes restantes par 60 (ce que ton script fait déjà, tps%3600 étant égal au nombre de secondes restantes)
Pour obtenir les secondes, il te suffit de récupérer les secondes restantes du calcul précédent (ce que ton script fait également)

Ex : 14000 secondes représentent
14000 / 3600 = 3.88, soit 3 heures (reste 3200 secondes)
3200 / 60 = 53.33, soit 53 minutes (reste 20 secondes)
et te donne donc le temps : 3" 53' 20
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 351 Messages

26 oct. 2007, 16:53

J'ai essayé en mettant cela :

Code : Tout sélectionner

tps-- ; h2 = parseInt((tps%3600)/24) ; m2 = parseInt((tps%3600)/60) ; s2 = parseInt((tps%3600)%60) ; disp = (h2<10 ? "0"+h2 : h2) + ':' + (m2<10 ? "0"+m2 : m2) + ':' + (s2<10 ? "0"+s2 : s2);
Mais ca ne fonctionne pas.