Eigenständige Zeitrechnung unter Javascript (Uhr)
-
Achja, und setInterval läuft schon ganz gut, also ich konnte keine Abweichungen nach 8 Stunden Testvorgang feststellen... hab ja nebenher die Windows-Uhr laufen lassen und extra so gestellt, dass sie exakt nach der Server-Uhr geht... und nach 8 Stunden waren immernoch beide synchron. Das ist also nicht das Problem... (Allerdings hab ich das bisher nur mit FireFox und IE getestet).
Ich wäre auch sehr dankbar, wenn jemand diese Seite unter Opera testen könnte... Seite ist in meiner Signatur.
-
Windoof schrieb:
wie man jetzt in Javascript die Sommer/Winterzeit berechnen kann...?
Was genau meinst du mit berechnen? Google liefert z.B. folgendes:
Umstellung von Winterzeit auf Sommerzeit:
Am letzten Sonntagmorgen im März werden die Uhren von 02:00 auf 03:00 Uhr vorgestellt. Man verliert eine Stunde.Umstellung von Sommerzeit auf Winterzeit:
Am letzten Sonntagmorgen im Oktober werden die Uhren von 03:00 auf 02:00 Uhr zurückgestellt. Man gewinnt eine Stunde.Damit sollte es ja nicht sllzu schwer sein, den Zeitpunkt ausfindig zu machen und dann eben dein _h entsprechend zu korrigieren. Oder suchst du was anderes
-
gut, dann präzisiere ich meine Frage... ich mach sie ein bischen praktischer:
Du rufst das Script auf und lässt es 5 Jahre laufen, es funktioniert alles wunderbar, etc... wie finde ich nur über Javascript heraus, wann der letzte Sonntag im März ist...? - Wenn mir dabei jemand helfen kann, ist alles weitere kein Problem.
-
Ich glaube ich hab's... kann das aber bitte mal jemand, der extrem gut in Mathematik ist... mal kurz durchrechnen und testen, ob es läuft? - ich weiß nicht, wie ich das testen soll ^^ bin das theoretisch durchgegangen und so, ich denke es haut hin, aber wirklich sicher bin ich mir da nicht...
<!-- var w=false; var _w=<?php echo date("w"); ?>; var _y=<?php echo date("Y"); ?>; var _m=<?php echo date("n"); ?>; var _d=<?php echo date("j"); ?>; var _h=<?php echo date("G"); ?>; var _i=<?php $_tmp=date("i"); if($_tmp[0]=='0') $_tmp=substr($_tmp,1,1); echo $_tmp; ?>; var _s=<?php $_tmp=date("s"); if($_tmp[0]=='0') $_tmp=substr($_tmp,1,1); echo $_tmp; ?>; var m_max=new Array(31,28+(_y%4==0),31,30,31,30,31,31,30,31,30,31); var td=":"; var dd="-"; function setTime() { ++_s; if(_s==60) { ++_i; _s=0; } if(_i==60) { ++_h; if(_h==2 && _w==0 && _m==3 && _d>m_max[_m]-7 && !w) { ++_h; w=true; } else if(_h==3 && _w==0 && _m==10 && _d>m_max[_m]-7 && !w) { --h; w=true; } _i=0; } if(_h==24) { ++_d; ++_w; if(_w==7) _w=0; _h=0; w=false; } if(_d>m_max[_m-1]) { ++_m; _d=1; } if(_m>12) { ++_y; _m=1; m_max[1]=28+(_y%4==0); } } function getTime(id) { var m,d,h,i,s; if(_m<10) m='0'+_m; else m=_m; if(_d<10) d='0'+_d; else d=_d; if(_h<10) h='0'+_h; else h=_h; if(_i<10) i='0'+_i; else i=_i; if(_s<10) s='0'+_s; else s=_s; document.getElementById(id).innerHTML=_y+dd+m+dd+d+' '+h+td+i+td+s+" (CET)"; } function showTime(id) { getTime(id); setInterval("getTime('"+id+"')",500); } setInterval("setTime()",1000); //-->
-
Ich würde es so irgendwie machen:
// Datum vom letzten Tag im März erzeugen temp_date = new Date(2005,2,31); // Schauen, was für ein Wochentag und dann entsprechend abziehen tag_sommerzeit_beginn = 31-temp_date.getDay(); // bzw. wenn du mit dem Datumsobjekt weiterarbeiten willst temp_date.setDate(tag_sommerzeit_beginn);
-
Zum Schaltjahr:
* Glatt durch 4 teilbare Jahre sind Schaltjahre.
* Glatt durch 100 teilbare Jahre sind jedoch keine Schaltjahre.
* Glatt durch 400 teilbare Jahre sind aber wieder Schaltjahre.
-
ähm... ok... danke dir, werd das gleich mal einbauen... xD wusste ich garnicht, dass das noch weiter geht - lol
EDIT: Die Formel lautet also von un an im \1:
X=28+(_y%4==0 && (_y%100!=0 || _y%400==0))
-
Ich verstehe nicht was du machen willst. Sorry.
Die Zeit wird nicht genau sein.
Ich habe schon bemerkt das nur ein laden eines PDF`s mit Firefox ein anderes Fenster kurz anhält. Adobe Acrobath.
Du kannst dir nicht sicher sein das der Timeout jede Sekunde kommt. Ist wie bei einem Windowstimer. Es ist eben kein Echtzeitsystem.
Deshalb nennt man ja die Uhr im Rechner Echtzeituhr. Sie funktiniert auch wenn der Rechner Volllast oder abgedreht ist.
Willst wirklich eine Webseite 5 Jahre offne lassen. In so einem Fall bietet sich ein eigene Programm an. Dies kann sich die Zeit über NTP holen.
-
es sollte aber ohne extraprogramme laufen
- ok, wenn jemand nebenher firefox voll ausastet, ist mir das auch egal, mir geht es nur darum, dass die theorie im code korrekt ist. in diesem beispiel gehe ich davon aus, dass der pc nichts weiter macht als meine website darzustellen... wenn die uhr dann immer funktioniert (theoretisch halt), bin ich zufrieden.
EDIT: Dass es mir nie gelingen wird, die Atomzeit darzustellen, ist mir auch klar, es sollte halt nur eine Uhr sein, nach der man siene Armbanduhr richten kann, mehr nicht... es geht mir nur darum, sowas mal programmiert zu haben... solange es theoretisch funktioniert, ist mir alles andere egal... ich mein... man kann auch keinen 3D-ActionShooter auf einem C64 laufen lassen, der DirectX 9.c erfordert... da kann man so viele Abfragen und Sicherheiten und Anti-Ruckel-Codes einbauen, wie man will... so ist es hier auch, jeder PC ist an einer anderen Stelle ausgelastet. Notfalls muss man halt refresh machen, wenn man sich nicht sicher ist, aber die Zeit soll einfach mal weiterzählen.
EDIT #2: Übrigens hab ich das mal grad getestet, von wegen ausgelastet: Firefox setzt den Interval fest, und wenn du das noch so ausastest, er zeigt es dann zwar nicht sofort an, aber mach mal folgenden Test: Größe des Fensters ändern, also wirklich mal ein bischen rumspielen, das Fenster also am Rand anklicken und mal die Größe verändern... und das ein paar Sekunden lang... und dann loslassen - was wird wohl passieren?
-
Du könntest auch die Arbeit JavaScript überlassen, indem du einfach ein Date-Objekt mit der Serverzeit erzeugst und davon dann mit getTime() die Millisekunden seit dem 1.1.1970 0:00:00 holst bzw. diese direkt schreibst. das Ganze machst du jetzt noch für die Systemzeit und schon hast du einen Offset (Zeitdifferenz zwischen Server und Client). Dann kannst du nämlich in der Timer-Funktion einfach die aktuelle Zeit holen, Offset aufaddieren und das Ganze wieder ausgeben
-
Hatte ich mir auch schon so überlegt... aber nu lass ich es so, wie es ist, es funktioniert ja... und das sogar ganz gut
Aber danke... hier nochmal das komplette Script (hab es noch ein bischen erweitert):
<!-- var w=false; var _w=<?php echo date("w"); ?>; var _y=<?php echo date("Y"); ?>; var _m=<?php echo date("n"); ?>; var _d=<?php echo date("j"); ?>; var _h=<?php echo date("G"); ?>; var _i=<?php $_tmp=date("i"); if($_tmp[0]=='0') $_tmp=substr($_tmp,1,1); echo $_tmp; ?>; var _s=<?php $_tmp=date("s"); if($_tmp[0]=='0') $_tmp=substr($_tmp,1,1); echo $_tmp; ?>; var m_max=new Array(31,28+(_y%4==0 && (_y%100!=0 || _y%400==0)),31,30,31,30,31,31,30,31,30,31); var w_day=new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); var tt=":"; var dd="-"; var dt=", "; function setTime() { ++_s; if(_s==60) { ++_i; _s=0; } if(_i==60) { ++_h; if(_h==2 && _w==0 && _m==3 && _d>m_max[_m]-7 && !w) { ++_h; w=true; } else if(_h==3 && _w==0 && _m==10 && _d>m_max[_m]-7 && !w) { --h; w=true; } _i=0; } if(_h==24) { ++_d; ++_w; if(_w==7) _w=0; _h=0; w=false; } if(_d>m_max[_m-1]) { ++_m; _d=1; } if(_m>12) { ++_y; _m=1; m_max[1]=28+(_y%4==0 && (_y%100!=0 || _y%400==0)); } } function getTime(id) { var m,d,h,i,s; if(_m<10) m='0'+_m; else m=_m; if(_d<10) d='0'+_d; else d=_d; if(_h<10) h='0'+_h; else h=_h; if(_i<10) i='0'+_i; else i=_i; if(_s<10) s='0'+_s; else s=_s; document.getElementById(id).innerHTML=w_day[_w]+dt+_y+dd+m+dd+d+" "+h+tt+i+tt+s+" (CET)"; } function showTime(id) { getTime(id); setInterval("getTime('"+id+"')",500); } setInterval("setTime()",1000); //-->