JavaScript Countdown von Serverzeit, nicht vom eigenen PC

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
846
Hallo,

ich habe folgendes Countdown-Script:

HTML:
<script type="text/javascript">
countdown_<?php echo $vspiel; ?> = function() {
    var tage = 'Tage';
    var countdown_d, countdown_h, countdown_m, countdown_s;
    var ausgabe_s, ausgabe_m, ausgabe_h;
    var endTime = new Array();
    var text = new Array();
    var i = 0;
	
    var ja = <?php echo substr($row99[1],0,4); ?>;
	var mo = <?php echo substr($row99[1],5,2)-1; ?>;
	var ta = <?php echo substr($row99[1],9,2); ?>;
	var st = <?php echo substr($row99[1],11,2); ?>;
	var mi = <?php echo substr($row99[1],14,2); ?>;
	var se = <?php echo substr($row99[1],17,2); ?>;
                
    // Hier alle Termine chronologisch(!) mit Datum und Text anlegen
	endTime[0] = new Date(ja, mo, ta, st, mi, se); //Jahr, Monat - 1 !!!!!!!, Tag, Stunden, Minuten, Sekunden
    text[0] = '';
  
                
    // Berechnung des nächsten Termins           
	var timeNow = new Date();
    while((endTime[i] - timeNow) < 0) {
        i++;
    }
	var diffTime = endTime[i] - timeNow; //in Millisekunden
	diffTime = Math.floor(diffTime/1000);
	
	//Berechnung der Tage, Stunden, Minuten, Sekunden
	if(diffTime >= 0) {
		countdown_d = Math.floor(diffTime / 86400);
		diffTime = diffTime % 86400;
		countdown_h = Math.floor(diffTime / 3600);
		diffTime = diffTime % 3600;
		countdown_m = Math.floor(diffTime / 60);
		countdown_s = diffTime % 60;
	
        if(countdown_s < 10) ausgabe_s = '0'+countdown_s;
        else ausgabe_s = countdown_s;
        if(countdown_m < 10) ausgabe_m = '0'+countdown_m;
        else ausgabe_m = countdown_m;
        if(countdown_h < 10) ausgabe_h = '0'+countdown_h;
        else ausgabe_h = countdown_h;
        if(countdown_d == 1) {
            tage = 'Tag';
        }	
        
        // verbleibende Zeit und Termintext schreiben
        document.getElementById('countdown_<?php echo $vspiel; ?>').innerHTML = '&raquo; '+ausgabe_h+':'+ausgabe_m+':'+ausgabe_s+' Vote-Pause!';
	}
	else {
	    document.getElementById('countdown_<?php echo $vspiel; ?>').innerHTML = '&raquo; Du kannst wieder voten!';
	    /*document.getElementById('countdown_<?php echo $vspiel; ?>').style.display = 'none'; */
	}
	setTimeout(countdown_<?php echo $vspiel; ?>, 1000);
}
window.onload = countdown_<?php echo $vspiel; ?>(); // Countdown anstoßen
</script>

Das funktioniert auch alles reibungslos. Nur wird die Zeit meines eigenen PC's genommen, statt vom Server.

Ich habe schon mit "getDate" rumgedoktort, indem ich "TimeNow" entsprechend bestückt habe, leider ohne Erfolg. Die Zeit läuft nicht mehr weiter, sondern bleibt stehen.

Ich weiß nicht mehr weiter und bitte um Hilfe.
 
JavaScript wird ja auch auf dem Client ausgeführt, und wenn du auf dem Client getDate oder sonstiges aufrufst, wird dann natürlich auch seine Uhrzeit genommen.
 
naja du musst auch nicht die timeNow (auf diese Weise) anpassen...
stattdessen musst du dir eine Variable "serverReferenceTime" oder so machen, wo einmal via PHP die Zeit reingeschrieben wird. Und beim Start des Scripts berechnest du dann ein mal die Differenz von Server-Zeit zum Client. Diese Differenz wird dann auf timeNow immer draufgerechnet...
 
Solche Scripts funktionieren eh nicht zuverlässig. Die meisten modernen Browser haben Energiespar-Methoden, durch die die JS-Ausführung bei Tabs im Hintergrund verzögert bzw. beinahe angehalten wird.
 
@Daarnon: Nur weil das Script jede Sekunde getriggert wird, heißt es ja nicht, dass bei jedem Script-Aufruf genau eine Sekunde vom Countdown abgezogen wird... aber man hätte den Code ja auch einfach mal anschauen können... (Stichwort: "var diffTime = endTime - timeNow; //in Millisekunden")
 
Das mit time() etc habe ich alles versucht und ich habe mich damit bereits 2-3 Stunden abgekämpft. Daher meine Hilfreschrei hier. Also stellt mich bitte hier nicht hin, als würde ich mich nicht ausreichend damit beschäftigen.

Aber ich habe grade eine Lösung gefunden. *freu*

Ich habe es nun anders gelöst:

HTML:
<script type="text/javascript">
function countdown_<?php echo $vspiel; ?>(zeit){
    var now = new Date(zeit);
    var day=now.getDate();
    var month=now.getMonth()+1;
    var year=now.getFullYear();
    if(year<999) year+=1900;
    var h=now.getHours();
    var m=now.getMinutes();
    var s=now.getSeconds();
    var text = " Test";
    var Gesamt= "&raquo; "+((h<10)?"0":"")+h+((m<10)?":0":":")+m+((s<10)?":0":":")+s+text;
    window.setTimeout("countdown_<?php echo $vspiel; ?>("+(zeit-1000)+")",1000);
    document.getElementById('countdown_<?php echo $vspiel; ?>').innerHTML=Gesamt;
    }
    window.setTimeout('countdown_<?php echo $vspiel; ?>(<? echo $timestamp_test * 1000; ?>)',1000);
</script>
 
Zurück
Oben