Eric Teubert: Zeiten beginnen nicht gleichzeitig

Und zwar zeige ich einerseits die Serverzeit an und zusätzlich zählt eine Art Countdown rückwärz. Beide Funktionen lade ich im body per onload, trotzdem beginnen sie nicht gleichzeitig und ich finde, es sieht nicht schön aus, wenn die Sekunden nicht absolut gleichzeitig ticken.
Außerdem fühlte ich mich dazu gezwungen, bei der Serverzeit jede 10tel Sekunde +107 zu addieren, statt +100, damit es mit der anderen Funktion in etwa gleichschnell "tickt". Das kann eigentlich auch nicht sein ...

hier mal der Code:

<script type="text/javascript">
<!--
var time    = new Date();
var seconds = <?echo $time;?>*1000-1000;
var times = new Array();

function SZeit()
{
  seconds += 107;
  time.setTime(seconds);

var Tag      = time.getDate();
  var Monat    = time.getMonth() + 1;
  var Jahr     = time.getYear();
  if(Jahr < 999) Jahr += 1900;
  var Stunden  = time.getHours();
  var Minuten  = time.getMinutes();
  var Sekunden = time.getSeconds();
  var Vortag   = ((Tag < 10) ? "0" : "");
  var Vormon   = ((Monat < 10) ? ".0" : ".");
  var Vorstd   = ((Stunden < 10) ? "0" : "");
  var Vormin   = ((Minuten < 10) ? ":0" : ":");
  var Vorsek   = ((Sekunden < 10) ? ":0" : ":");
  var Datum    = Vortag + Tag + Vormon + Monat  + "." + Jahr;
  var Uhrzeit  = Vorstd + Stunden + Vormin + Minuten + Vorsek + Sekunden;
  var Gesamt   = Datum + ", " + Uhrzeit;

document.getElementById('servertime').firstChild.data = Gesamt;
  window.setTimeout('SZeit()',100);
}

var startdate = new Date();
var starttime = <? echo$act1v3;?>*1000;
var javatime = startdate.getTime();
var phptime = <?echo $time;?>*1000;
var zeitdif = 0;

if( phptime - javatime > 0 ) {
var zeitdif = (phptime - javatime) / 1000;
}

if( phptime - javatime < 0 ) {
var zeitdif = (javatime - phptime) / 1000;
}

function ZeitAnzeigen()
{
var absSekunden = Math.round(ZeitBerechnen()+zeitdif);
var relSekunden = absSekunden % 60;
var absMinuten = Math.abs(Math.round((absSekunden-30)/60));
var relMinuten = absMinuten % 60;
var absStunden = Math.abs(Math.round((absMinuten-30)/60));

var anzSekunden ="" + ((relSekunden > 9) ? relSekunden : "0" + relSekunden);
var anzMinuten ="" + ((relMinuten > 9) ? relMinuten : "0" + relMinuten);
var anzStunden ="" + ((absStunden > 9) ? absMinuten : "0" + absStunden);

if(absSekunden > 0) {
document.getElementById('time').firstChild.data = anzStunden + ":" + anzMinuten + ":" + anzSekunden;
}
else
{
document.getElementById('time').firstChild.data = "Fertig!";
}
window.setTimeout('ZeitAnzeigen()',100);
}

function ZeitBerechnen()
{
var actdate = new Date();
return((starttime - actdate.getTime())/1000);
}
// -->
</script>

  1. Hi,

    Beide Funktionen lade ich im body per onload, trotzdem beginnen sie nicht gleichzeitig

    natürlich nicht. Erstens hat schon Einstein bewiesen, dass es in diesem Universum keine Gleichzeitigkeit gibt; zweitens ist die Ausführung serverseitigen Codes längst Jahre her, bevor irgendein Client auch nur auf die Idee kommt, irgend etwas machen zu können.

    und ich finde, es sieht nicht schön aus, wenn die Sekunden nicht absolut gleichzeitig ticken.

    Du kannst so aber recht gut messen, wie lange die Übertragung der Daten vom Server zu Client gedauert hat. Nicht, dass das irgend eine Bedeutung hätte.

    Außerdem fühlte ich mich dazu gezwungen, bei der Serverzeit jede 10tel Sekunde +107 zu addieren, statt +100, damit es mit der anderen Funktion in etwa gleichschnell "tickt". Das kann eigentlich auch nicht sein ...

    Bei Dir(!) scheint die eine Funktion sieben Millisekunden länger zur Ausführung zu brauchen als die andere. Wieso soll das nicht sein können?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Nungut, dann gibt es ebend keine exakte Gleichzeitigkeit - ich formuliere um:
      Ich möchte, dass die beiden Funktionen für den menschlichen Wahrnehmungssinn gleichzeitig beginnen und gleichschnell hoch-bzw herunterzählen.
      Ich bin mir sicher, dass es dafür Möglichkeiten gibt ... und wie lange die Übertragung der Daten vom Server zum Client gedauert hat, ist mir in diesem Moment ziemlich egal :)

      1. Hallo,

        [...] und wie lange die Übertragung der Daten vom Server zum Client gedauert hat, ist mir in diesem Moment ziemlich egal :)

        Dann hast du entweder
          a) nicht gelesen, was Cheatah geschrieben hat
        oder
          b) es nicht verstanden

        Du legst die Startzeit mit PHP fest, d.h. wenn sich die Datei noch auf dem Server befindet. Wenn du die aber in deinem Browser siehst ist das schon um einiges später (in deinem Fall eben besagte 7ms). Dein Javascript wird aber erst im Client geparst..

        Viele Grüße
        Patrick

        --
        "Though this be madness, yet there's method in't."
        sh:( fo:| ch:? rl:( br:^ n4:( ie:{ mo:) va:} de:> zu:) fl:| js:( ss:| ls:[
        1. Du legst die Startzeit mit PHP fest, d.h. wenn sich die Datei noch auf dem Server befindet. Wenn du die aber in deinem Browser siehst ist das schon um einiges später (in deinem Fall eben besagte 7ms). Dein Javascript wird aber erst im Client geparst..

          Hi,

          mit anderen Worten, ich müsste die PHP-Berechnung auch um diese Zeit verzögern ... aber das geht doch nicht?
          Außerdem liegt mein Problem - glaube ich - woanders, denn was mir am wichtigsten wäre, ist das gleichzeitige herunterticken. Und die Serverzeit "tickt" das erste mal etwa eine halbe Sekunde nach der Countdownzeit. Da ist nicht mehr viel mit 7ms ...

          Das dürfte andere Ursachen habe ... oder?

          Eric

          1. Hi,

            mit anderen Worten, ich müsste die PHP-Berechnung auch um diese Zeit verzögern ... aber das geht doch nicht?

            Klar geht das, aber warum möchtest Du das machen?
            Der Client hat selber eine Uhr, also kannst Du die subjektive Gleichzeitigkeit am besten per Javascript erreichen. Du könntest auch per PHP eine Art Referenzzeit schicken, anhand derer sich das Javascript ausrichtet. Die Uhren auf der Clientseite gehen ja z.B. nicht unbedingt richtig. Es gibt allerdings eine feste Grenze der minimalen Auflösung dabei: das Timeout von TCP/IP, das theoretisch bei 60 Sekunden liegt, praktich aber meist bei 30 Sekunden. Genauer kannst Du also die Startzeit nicht angeben. Da es ncoh andere SChweirigkeiten dabei geben kann, würde ich mich bei sowas nicht mehr als auf die erfolgreiche Weitergabe der passenden Zeitzone verlassen wollen.

            Außerdem liegt mein Problem - glaube ich - woanders, denn was mir am wichtigsten wäre, ist das gleichzeitige herunterticken. Und die Serverzeit "tickt" das erste mal etwa eine halbe Sekunde nach der Countdownzeit. Da ist nicht mehr viel mit 7ms ...

            Das dürfte andere Ursachen habe ... oder?

            Ja, Dein Algorithmus. Du kannst in Deinem Falle Server und Clientzeit ohne aufwendige Synchronisation nicht abgleichen. Aufgrund der normalen Sicherheitseinstellungen der Browser dürfte das per Javascript schwierig werden.

            Also werde Dich einfach einig und benutze _entweder_ die Serverzeit _oder_ die Clientzeit.

            so short

            Christoph Zurnieden