Uhr läuft nicht
_roro
- javascript
0 wahsaga0 _roro0 derletztekick0 _roro0 derletztekick0 _roro0 derletztekick0 _roro
moin,
ich habe mir mal die Uhr geschnappt, funktioniert prima.
Nun möchte ich die Zeit von einem Time-server holen und Meine Uhr damit initialisieren, aber die Uhr läuft nicht weiter, wenn ich
var Jetzt = new Date(tt);
setze, also das Objekt mit Millisekunden seit 1.1.70 initialisiere.
Was habe falschgemacht?
roro
hi,
Nun möchte ich die Zeit von einem Time-server holen und Meine Uhr damit initialisieren, aber die Uhr läuft nicht weiter, wenn ich
var Jetzt = new Date(tt);
setze, also das Objekt mit Millisekunden seit 1.1.70 initialisiere.
Und was enthält tt (Kontrollausgabe)?
gruß,
wahsaga
moin,
Nun möchte ich die Zeit von einem Time-server holen und Meine Uhr damit initialisieren, aber die Uhr läuft nicht weiter, wenn ich
var Jetzt = new Date(tt);
setze, also das Objekt mit Millisekunden seit 1.1.70 initialisiere.
Und was enthält tt (Kontrollausgabe)?
Eine Zeit, die stehengeblieben ist, so ein Mist. Genau hier ist mein Fehler, danke wahsaga!
Aber wie kann ich denn diese schöne Uhr so umbauen, dass sie
-initialisiert werden kann
-und dann weiterläuft?
Bitte um einen Lösungsansatz.
roro
Damit ich nicht mit leeren Händen komme, untenstehend der PERL-hack, wie die Zeit vom Server, Port 37 geholt wird.
# Server Send the time as a 32 bit binary number.
# time in seconds since 1.1.1900
# 25567 Tage ist die Differenz zum 1.1.1970
# my $sdiff = 2208988800; #25567 * 86400;
sub getTime{
my $host = shift;
my $client_socket = new IO::Socket::INET (
PeerAddr => $host,
PeerPort => 37,
Proto => 'tcp')|| return;
my $server_time = <$client_socket>;
$client_socket->close();
my $time = bin2dec($server_time) - 2208988800;
return($time);
}
###########################################################################
sub bin2dec{ return unpack("N", pack("a32", shift));}
###########################################################################
Hallo _roro,
Bitte um einen Lösungsansatz.
Du weißt, das es an dem tt liegt. Schau Dir mal den Funktionsaufruf an und den Inhalt der Funktion:
function ZeitAnzeigen () {
var tt = "1174749422" * 1000;
//...
}
und starten tust Du es via window.setTimeout("ZeitAnzeigen()", 1000);
Das bedeutet, bei jedem Aufruf wird das Date-Objekt neu erzeugt mit dem Wert aus tt. Wenn tt statisch ist, erzeugst Du auch eine statische Ausgabe.
Mit freundlichem Gruß
Micha
moin,
Das bedeutet, bei jedem Aufruf wird das Date-Objekt neu erzeugt mit dem Wert aus tt. Wenn tt statisch ist, erzeugst Du auch eine statische Ausgabe.
Ja, das ist dumm... Noch blöder wärs, bei jedem Aufruf die Zeit vom Server neu zu holen.
roro
Hallo _roro,
Ja, das ist dumm... Noch blöder wärs, bei jedem Aufruf die Zeit vom Server neu zu holen.
Ja, das wäre es. Folglich musst Du die Zeitänderung vom User nehmen aber den Startzeitpunkt _einmalig_ vom Server.
Mit freundlichem Gruß
Micha
moin Micha,
Ja, das ist dumm... Noch blöder wärs, bei jedem Aufruf die Zeit vom Server neu zu holen.
Ja, das wäre es. Folglich musst Du die Zeitänderung vom User nehmen aber den Startzeitpunkt _einmalig_ vom Server.
Danke an alle Hilfestellungen, war etwas zerstreut heute, bitte um Nachsicht.
roro
Hallo _roro,
Hmm, ich finde die Lösung nicht so toll. Es könnte zu einem Zeitdrift kommen, wenn Du einfach nur addierst. Ich würde einen Abgleich zwischen Server- und Clientzeit machen.
const serverRefTime = 1174758873 * 1000; // Deine Serverzeit
const clientRefTime = new Date().getTime();
function setClock(){
var dt = Math.abs(new Date().getTime()-clientRefTime);
var now = new Date(serverRefTime+dt);
var ss = (now.getSeconds()<10)?"0"+now.getSeconds():now.getSeconds();
var mm = (now.getMinutes()<10)?"0"+now.getMinutes():now.getMinutes();
var hh = (now.getHours()<10)?"0"+now.getHours():now.getHours();
var str = hh+":"+mm+":"+ss;
document.getElementById("clock").firstChild.replaceData(0, str.length, str);
}
window.setInterval("setClock()", 500);
window.onload = setClock;
Mit freundlichem Gruß
Micha
Hallo Micha,
Ich habs
Hmm, ich finde die Lösung nicht so toll. Es könnte zu einem Zeitdrift kommen, wenn Du einfach nur addierst. Ich würde einen Abgleich zwischen Server- und Clientzeit machen.
Dass es eine Zeitdrift geben kann, ist klar. Aber das Stellen der PC-Uhr, denke ich, überlasse ich lieber dem Benutzer.
Wie auch immer, danke für Deine Überlegungen!
roro
Und Grüße an Alle Tüftler.
Hallo _roro,
Ich habs
Hmm, ich finde die Lösung nicht so toll. Es könnte zu einem Zeitdrift kommen, wenn Du einfach nur addierst. Ich würde einen Abgleich zwischen Server- und Clientzeit machen.Dass es eine Zeitdrift geben kann, ist klar.
Der zB auch kommen kann, wenn der Browser mal nicht exakt einer Sekunde benötigt, um das Script zu aktualisieren... Würde es ein extremer Aufwand sein, es besser zu machen, würde ich Deine Bedenken verstehen so eher weniger...
Mit freundlichem Gruß
Micha
moin,
Ich habs
Hmm, ich finde die Lösung nicht so toll. Es könnte zu einem Zeitdrift kommen, wenn Du einfach nur addierst. Ich würde einen Abgleich zwischen Server- und Clientzeit machen.Dass es eine Zeitdrift geben kann, ist klar.
Der zB auch kommen kann, wenn der Browser mal nicht exakt einer Sekunde benötigt, um das Script zu aktualisieren... Würde es ein extremer Aufwand sein, es besser zu machen, würde ich Deine Bedenken verstehen so eher weniger...
Durch Laufzeiten bedingt geht diese Uhr grundsätzlich um 1..2 Sekunden nach, bereits beim Laden. Und nach dem Laden wird sie auch langsam langsamer. Die Seite neu laden und schon geht diese Uhr wieder (fast) richtig, sie soll ja auch nicht ewig laufen.
Meine Bedenken zum Abgleich der ClientZeit bestehen nicht wegen dem Aufwand. Ich bin der Meinung, dass eine Webseite nicht ungefragt die Zeit am PC verstellen sollte.
Vor ein paar Jahren habe ich mal einen SELF-Artikel über daytime und sockets/PERL geschrieben:
http://aktuell.de.selfhtml.org/artikel/server/daytime/
Da ich neuerlich nach TimeServern suchte (die im Artikel angegebenen Timeserver gibts nicht mehr), stellte ich auch fest, dass das Protocol 'daytime' total aus der Mode gekommen ist, d.h., keiner der von mir gefundenen aktuellen Zeitserver stellt die Uhrzeit als string am Port 13 bereit.
Wahrscheinlich ist das auch deswegen deprecated, weil es für diesen String nie einen einheitlichen Standard gab, auch nicht in der RFC 867.
Alle heute tätigen Timeserver benutzen das protocoll 'time' und stellen die Uhrzeit als 32-Bit-Binärzahl am Port 37 zur Verfügung.
Weil ich eine solche Uhr schon seit Längerem brauchte, schon immer einmal was über das time-protocol schreiben wollte, auch ein bischen JavaScript besser kennenlernen wollte und gestern Mistwetter war habe ich dieses CGI geschrieben ;-)
Btw., auf meiner Suche nach einer online-Uhr fand ich eine Webseite mit einer richtig schön gemachten Uhr als MMFlash. Leider zeigte diese coole Uhr auch nur meine eigene Systemzeit an. Ein Grund mehr, was Eigenes zu schreiben :)
roro
Meine Bedenken zum Abgleich der ClientZeit bestehen nicht wegen dem Aufwand. Ich bin der Meinung, dass eine Webseite nicht ungefragt die Zeit am PC verstellen sollte.
Das kann JS auch nicht, der Vorschlag ging dahin, dass einfach die Differenz zwischen deiner und der genauen Zeit gespeichert wird und dann immer die jeweils aktuelle mit diesem Offset berechnet wird, aus der Systemzeit.
So wie du es jetzt machst ist es extrem ungenau da die timeouts selten exakt sind.
Struppi.
Meine Bedenken zum Abgleich der ClientZeit bestehen nicht wegen dem Aufwand. Ich bin der Meinung, dass eine Webseite nicht ungefragt die Zeit am PC verstellen sollte.
Das kann JS auch nicht, der Vorschlag ging dahin, dass einfach die Differenz zwischen deiner und der genauen Zeit gespeichert wird und dann immer die jeweils aktuelle mit diesem Offset berechnet wird, aus der Systemzeit.
Achso meint er das. Danke Struppi.
Schönen Sonntag, Rolf