Compte à rebours, tout dépend de l'heure...

ViPHP
ViPHP | 3607 Messages

11 mai 2007, 12:05

sinon il y a une autre manière de voir (je sais pas la coder mais bon)
C'est de récupérer au départ la date du serveur, et calculer la différence (le décalage horaire) entre la date serveur et la date client, et c'est seulement cette valeur que l'on garde en mémoire...
Ensuite, tu reprends ton script initial, et tu ajoute (ou soustrait) le décalage...
ça devrait le faire non ?

Mammouth du PHP | 1353 Messages

11 mai 2007, 12:20

Oui à mon avis ça marche aussi... ca donnerait quelque chose comme ca :

Code : Tout sélectionner

<script language="JavaScript1.2"> function setcountdown(theyear,themonth,theday,thehour,themin,thesec){ yr=theyear;mo=themonth;da=theday;hr=thehour;min=themin;sec=thesec } function setdecalage(theyear,themonth,theday,thehour,themin,thesec) { var today=new Date() var today_y=today.getYear() if (today_y < 1000) today_y+=1900 dtodayy = theyear - today_y; dtodaym = themonth - today.getMonth() ; dtodayd = theday - today.getDate(); dtodayh = thehour - today.getHours() ; dtodaymin = themin - today.getMinutes() ; dtodaysec = thesec - today.getSeconds() ; } // 1°) Configurez la date dans le futur dans le format ANNEE, MOIS, JOUR, HEURES sur 24h (0=minuit,23=11pm), MINUTES, SECONDES setcountdown(2007,05,20,19,42,00) setdecalage(<?php echo date('Y').",".date('m').",".date('d').",".date('H').",".date('i').",".date('s'); ?>); // 2°) Changez les deux textes ci-dessous. Le premier pour annoncer l'évènement, le second qui s'affichera à la fin du compte à rebours. var occasion="" var message_on_occasion="C'est aujourd'hui l'ouverture, patience..." // 3°) Configurez ci-dessous 5 variables pour la largeur, hauteur, la couleur de l'arrière plan, et le style du texte du champ var countdownwidth='100%' // ou une valeur en % comme var countdownwidth='95%' var countdownheight='35px' var countdownbgcolor='' // ou une couleur en texte comme : lightyellow var opentags='<p><font size="4" face="tahoma"><strong>' var closetags='</strong></font></p>' ////////// NE RIEN EDITER CI-DESSOUS ////////////////// var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") var crosscount='' function start_countdown(){ if (document.layers) document.countdownnsmain.visibility="show" else if (document.all||document.getElementById) crosscount=document.getElementById&&!document.all?document.getElementById("countdownie") : countdownie countdown() } if (document.all||document.getElementById) document.write('<span id="countdownie" style="width:'+countdownwidth+'; background-color:'+countdownbgcolor+'"></span>') window.onload=start_countdown function countdown(){ var today=new Date() var todayy=today.getYear() if (todayy < 1000) todayy+=1900 todayy+=dtodayy; var todaym=today.getMonth()+dtodaym var todayd=today.getDate()+dtodayd var todayh=today.getHours()+dtodayh var todaymin=today.getMinutes()+dtodaymin var todaysec=today.getSeconds()+dtodaysec var todaystring=montharray[todaym-1]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec futurestring=montharray[mo-1]+" "+da+", "+yr+" "+hr+":"+min+":"+sec dd=Date.parse(futurestring)-Date.parse(todaystring) dday=Math.floor(dd/(60*60*1000*24)*1) dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1) dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1) dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1) //if on day of occasion if(dday<=0&&dhour<=0&&dmin<=0&&dsec<=1&&todayd==da){ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(opentags+message_on_occasion+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=opentags+message_on_occasion+closetags return } //if passed day of occasion else if (dday<=-1){ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(opentags+"Prochainement..."+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=opentags+"L'évènement est déjà arrivé ! "+closetags return } //else, if not yet else{ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes"+occasion+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes"+occasion+closetags } setTimeout("countdown()",1000) } </script>
et effectivement ca peut etre une meilleure solution ;)
le probleme c'est que je teste en local donc l'heure du serveur est la meme que celle de mon pc donc je peux pas faire de tests concluants... Il n'en demeure pas moins que l'idée est bonne :) (voila, on sait jamais au cas ou ca interesse quelqu'un...)
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 351 Messages

11 mai 2007, 12:50

Tout marche nikel, merci beaucoup à vous.

Eléphant du PHP | 351 Messages

11 mai 2007, 12:55

J'ai donc mis au final ce code:

Code : Tout sélectionner

<script language="JavaScript1.2"> function setcountdown(theyear,themonth,theday,thehour,themin,thesec){ yr=theyear;mo=themonth;da=theday;hr=thehour;min=themin;sec=thesec } function settoday(theyear,themonth,theday,thehour,themin,thesec) { todayy=theyear ; todaym=themonth; todayd=theday; todayh=thehour; todaymin=themin; todaysec=thesec-2; if(todaym==4 || todaym==6 || todaym==9 ||todaym==11) max_month=30; else if(todaym==2) max_month=28; else max_month=31; } // 1°) Configurez la date dans le futur dans le format ANNEE, MOIS, JOUR, HEURES sur 24h (0=minuit,23=11pm), MINUTES, SECONDES setcountdown(2007,05,31,19,0,00) settoday(<?php echo date('Y').",".date('m').",".date('d').",".date('H').",".date('i').",".date('s'); ?>); // 2°) Changez les deux textes ci-dessous. Le premier pour annoncer l'évènement, le second qui s'affichera à la fin du compte à rebours. var occasion="" var message_on_occasion="C'est aujourd'hui l'ouverture, patience..." // 3°) Configurez ci-dessous 5 variables pour la largeur, hauteur, la couleur de l'arrière plan, et le style du texte du champ var countdownwidth='100%' // ou une valeur en % comme var countdownwidth='95%' var countdownheight='35px' var countdownbgcolor='' // ou une couleur en texte comme : lightyellow var opentags='<p><font size="4" face="tahoma"><strong>' var closetags='</strong></font></p>' ////////// NE RIEN EDITER CI-DESSOUS ////////////////// var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") var crosscount='' function start_countdown(){ if (document.layers) document.countdownnsmain.visibility="show" else if (document.all||document.getElementById) crosscount=document.getElementById&&!document.all?document.getElementById("countdownie") : countdownie countdown() } if (document.all||document.getElementById) document.write('<span id="countdownie" style="width:'+countdownwidth+'; background-color:'+countdownbgcolor+'"></span>') window.onload=start_countdown function countdown(){ todaysec++; if(todaysec==60) { todaysec=0; todaymin++; if(todaymin==60) { todaymin=0; todayh++; if(todayh==24) { todayh=0; todayd++; if(todayd==max_month+1) { todayd=1 todaym++ if(todaym++==13) { todaym=1; todayy++; } } } } } var todaystring=montharray[todaym-1]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec futurestring=montharray[mo-1]+" "+da+", "+yr+" "+hr+":"+min+":"+sec dd=Date.parse(futurestring)-Date.parse(todaystring) dday=Math.floor(dd/(60*60*1000*24)*1) dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1) dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1) dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1) //if on day of occasion if(dday<=0&&dhour<=0&&dmin<=0&&dsec<=1&&todayd==da){ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(opentags+message_on_occasion+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=opentags+message_on_occasion+closetags return } //if passed day of occasion else if (dday<=-1){ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(opentags+"Prochainement..."+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=opentags+"L'évènement est déjà arrivé ! "+closetags return } //else, if not yet else{ if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes"+occasion+closetags) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML=""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes"+occasion+closetags } setTimeout("countdown()",1000) } </script>
Et j'ai une dernière question pour vous embeter, il y a t-il possibilité de faire affiche les milisecondes?

Merci

PS : Pourquoi les chiffres (heures, jours et minutes) ne sont pas avec les zeros initaux?

Mammouth du PHP | 1353 Messages

11 mai 2007, 13:39

Pour les millisecondes j'ai tenté de modifier le code est pour une raison que j'ignore 100ms = 1 seconde et non pas 1000... C'est étrange mais bref ca fonctionne pas donc ca sert a rien que je poste le code... Peut etre quelqu'un de plus compétent arrivera a l'adapter...

Quand a ta question je ne suis pas sur de la comprendre ? tu voudrais que les chiffres en dessous de 10 apparaissent sur 2 chiffres ? 6 secondes devrait etre 06 ? Si c'est cela je ne sais pas si c'était le cas au départ, sinon la facon la plus simple a mon avis est de modifier l'affichage uniquement...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 351 Messages

11 mai 2007, 13:41

Si ca ne te dérange pas, j'aimerai bien voir le code avec les millisecondes, et pour les zeros, oui c'est bien ça.

Mammouth du PHP | 1353 Messages

11 mai 2007, 13:48

<script language="JavaScript1.2"> 
function setcountdown(theyear,themonth,theday,thehour,themin,thesec){ 
yr=theyear;mo=themonth;da=theday;hr=thehour;min=themin;sec=thesec 
} 

function settoday(theyear,themonth,theday,thehour,themin,thesec) {
todayy=theyear ;
todaym=themonth;
todayd=theday;
todayh=thehour;
todaymin=themin;
todaysec=thesec-2;
if(todaym==4 || todaym==6 || todaym==9 ||todaym==11) max_month=30;
else if(todaym==2) max_month=28;
else max_month=31;
msec=1000;
}
// 1°) Configurez la date dans le futur dans le format ANNEE, MOIS, JOUR, HEURES sur 24h (0=minuit,23=11pm), MINUTES, SECONDES 
setcountdown(2007,05,20,18,38,0) 
settoday(<?php echo date('Y').",".date('m').",".date('d').",".date('H').",".date('i').",".date('s'); ?>);


// 2°) Changez les deux textes ci-dessous. Le premier pour annoncer l'évènement, le second qui s'affichera à la fin du compte à rebours. 
var occasion="" 
var message_on_occasion="C'est aujourd'hui l'ouverture, patience..." 

// 3°) Configurez ci-dessous 5 variables pour la largeur, hauteur, la couleur de l'arrière plan, et le style du texte du champ 
var countdownwidth='100%' // ou une valeur en % comme var countdownwidth='95%' 
var countdownheight='35px' 
var countdownbgcolor='' // ou une couleur en texte comme : lightyellow 
var opentags='<p><font size="4" face="tahoma"><strong>' 
var closetags='</strong></font></p>' 

////////// NE RIEN EDITER CI-DESSOUS ////////////////// 

var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") 
var crosscount='' 

function start_countdown(){ 
if (document.layers) 
document.countdownnsmain.visibility="show" 
else if (document.all||document.getElementById) 
crosscount=document.getElementById&&!document.all?document.getElementById("countdownie") : countdownie 

countdown() 
} 

if (document.all||document.getElementById) 
document.write('<span id="countdownie" style="width:'+countdownwidth+'; background-color:'+countdownbgcolor+'"></span>') 

window.onload=start_countdown 


function countdown(){ 
	msec--;
	if(msec==0) {
	msec=1000;
	todaysec++;
	if(todaysec==60) {
		todaysec=0;
		todaymin++;
		if(todaymin==60) {
			todaymin=0;
			todayh++;
			if(todayh==24) {
				todayh=0;
				todayd++;
				if(todayd==max_month+1) {
					todayd=1
					todaym++
					if(todaym++==13) {
						todaym=1;
						todayy++;
						}
					}			
				}
			}
		}
	}
var todaystring=montharray[todaym-1]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec 
futurestring=montharray[mo-1]+" "+da+", "+yr+" "+hr+":"+min+":"+sec 
dd=Date.parse(futurestring)-Date.parse(todaystring) 
dday=Math.floor(dd/(60*60*1000*24)*1) 
dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1) 
dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1) 
dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1) 
//if on day of occasion 
if(dday<=0&&dhour<=0&&dmin<=0&&dsec<=1&&todayd==da){ 
if (document.layers){ 
document.countdownnsmain.document.countdownnssub.document.write(opentags+message_on_occasion+closetags) 
document.countdownnsmain.document.countdownnssub.document.close() 
} 
else if (document.all||document.getElementById) 
crosscount.innerHTML=opentags+message_on_occasion+closetags 
return 
} 
//if passed day of occasion 
else if (dday<=-1){ 
if (document.layers){ 
document.countdownnsmain.document.countdownnssub.document.write(opentags+"Prochainement..."+closetags) 
document.countdownnsmain.document.countdownnssub.document.close() 
} 
else if (document.all||document.getElementById) 
crosscount.innerHTML=opentags+"L'évènement est déjà arrivé ! "+closetags 
return 
} 
//else, if not yet 
else{ 
if (document.layers){ 
document.countdownnsmain.document.countdownnssub.document.write(""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes, et "+msec+" millisecondes"+occasion+closetags) 
document.countdownnsmain.document.countdownnssub.document.close() 
} 
else if (document.all||document.getElementById) 
crosscount.innerHTML=""+opentags+dday+ " jours, "+dhour+" heures, "+dmin+" minutes, et "+dsec+" secondes, et "+msec+" millisecondes"+occasion+closetags 
} 
setTimeout("countdown()",1) 
} 
</script> 
Voila version qui devrait fonctionner mais qui ne marche pas (car 100ms=1sec, ce qui est etrange). Si tu veux feinter pour que cela soit plus ou moins exact remplace la ligne

Code : Tout sélectionner

msec--;
par

Code : Tout sélectionner

msec-=10;
dans countdown() mais ca reste très approximatif... je comprend pas bien pourquoi...

Pour l'affichage sur deux chiffres quand je le change je perd la mise en forme bizarrement...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 351 Messages

11 mai 2007, 13:57

Ok, c'est tout bon, merci beaucoup de ton aide.

Mammouth du PHP | 1353 Messages

11 mai 2007, 14:03

Dernier détail, si tu veux afficher sur deux chiffres, remplace juste la fin du script (a partir de //else, if not yet) par celui la... je te conseillerai d'essayer de le comprendre en + et c tres simple ;)

Pour les millisecondes je comprend toujours pas... voila bon courage !

Code : Tout sélectionner

//else, if not yet else{ chaine = ""+opentags+dday+ " jours, " if(dhour<10) chaine+= "0"; chaine += dhour+" heures, " if(dmin<10) chaine+= "0"; chaine += dmin+" minutes, et " if(dsec<10) chaine+= "0"; chaine += dsec+" secondes, et "+msec+" millisecondes"+occasion+closetags if (document.layers){ document.countdownnsmain.document.countdownnssub.document.write(""+chaine) document.countdownnsmain.document.countdownnssub.document.close() } else if (document.all||document.getElementById) crosscount.innerHTML= ""+chaine } setTimeout("countdown()",1) } </script>
Tell me and I forget. Teach me and I remember. Involve me and I learn.