Henryk Plötz: da muss noch nen denkfehler sein :-(

Beitrag lesen

Moin,

var timestamp = 1099272882359; var zeit=new Date(); zeit.setTime(timestamp);

Das kannt man auch zusammenschreiben zu var zeit=new Date(timestamp);  (Ja, die Möglichkeit fehlte bisher in Selfhtml, das ist in 8.1 korrigiert.)

var offset = dat.getTimezoneOffset()*60;
        GMTdates[Nr] = stamp + offset;

Was soll das werden? Mach dir doch erst mal den Unterschied zwischen Zeitpunkten und bestimmten Repräsentationen davon klar. Ein Zeitpunkt ist ein universales Ding, völlig unabhängig vom Ort (naja, die Relativitätstheorie lassen wir mal beiseite ;). Das ist wie bei anderen physikalischen Größen, wie etwa Längen: Die Länge eines Objektes ist unabhängig von der Einheit in der du sie angibst.

Date-Objekte stellen Zeit_punkte_ dar, und keine bestimmten Zahlenwerte in irgendeiner Zeitzone. Eine im wesentlichen äquivalente Darstellung erreicht man jetzt über Timestamps, also die Differenz zu einem bestimmten Zeitpunkt auf den man sich geeignigt hat. (In der Längenanalogie wäre das der Größenvergleich mit dem Urmeter: Ob du eine Länge in cm, Angström oder Furlongs angibt macht dann keinen Unterschied, wichtig ist das Verhältnis zum Urmeter.)

Bei Timestamps ist normalerweise der 1. Januar 1970, 0:00:00 GMT der Bezugspunkt (beachte die Angabe der Zeitzone, das ist äquivalent der Angabe einer Längeneinheit: nur "1. Januar 1970, 0:00:00" zu sagen wäre wie wenn man sagen würde "Dieser Stock ist 17 lang"). Wir erinnern uns: Das ist ein Zeitpunkt angegeben in einer bestimmten Zeitzone. Der gleiche Zeitpunkt wäre zum Beispiel 1. Januar 1970, 1:00:00 CET. Oder als Timestamp ausgedrückt "0".

Da oben tust du aber etwas merkwürdiges und ziehst irgendwas von einem Timestamp ab oder addierst hinzu. Der Timestamp bezeichnet dann nicht mehr den gleichen Zeitpunkt, sondern irgendeinen anderen, das willst du sicher nicht.

Um das eigentliche Problem zu lösen solltest du erstmal versuchen deine Zeitangaben so lange wie möglich in Timestamp-Form zu halten, das ist wesentlich weniger verwirrend. Ähnlich wie du nicht einfach so 30m von 4 Furlongs abziehen kannst, kannst du mit "1.11.2004 22:30:17 CET" und "3.11.2004 17:15:03 EST" nicht direkt rechnen.

Besorge dir also die drei Zeiten mit denen du rechnen musst zunächst in Timestamp-Format: Die aktuelle Serverzeit kriegst du geschenkt, die aktuelle Client-Zeit ebenso fast (halt ein neues Date-Objekt erzeugen und dann getTime() rufen). Damit kannst du relativ einfach die Serverzeit auf dem Client interpolieren (beim Laden die Differenz zwischen Serverzeit und Clienzeit bilden und die dann später auf die Clientzeit aufschlagen).

Deine Endzeitpunkte solltest du ebenso als Timestamp verwalten (wir erinnern uns: Timestamps und Zeitzonen haben absolut nichts miteinander zu tun). Das kommt drauf an wo du die herkriegst, ob sie da schon als Timestamps vorliegen oder du sie erst umrechnen musst (wenn du von einer Datumsangabe in einen Timestamp umrechnest musst du halt beachten in welcher Zeitzone das Datum angegeben ist).

Die Restzeit bis zum Ende kannst du jetzt trivial durch Subtraktion ermitteln. Beachte, dass hier nirgendwo auch nur der Hauch einer Zeitzone auftaucht, denn solange du nur mit Zeitpunkten intern agieren musst spielen die einfach keine Rolle. Etwas anders wird das ggbf. wenn du mal einen Zeitpunkt (und nicht nur eine Differenz, die ist ja unabhängig von Zeitzonen) an den Benutzer ausgeben musst. Im Prinzip ist es ok, einfach nur die Zeit in GMT auszugeben (benutze dazu die getUTC*()-Funktionen des Date-Objektes), nett wäre es ggbf. die Zeit in Lokalzeit anzugeben (benutze dazu die get*()-Funktionen). Die Zeitzone die du verwendest musst du in jedem Fall angeben.

Alle Komplikationen was Sommerzeit/Winterzeit oder Konvertierung in Lokalzeit angeht muss aber das Date-Objekt für dich übernehmen, da hast du nichts weiter mit zu schaffen als eine Funktion für "Gib mir den Stundenteil in lokaler Zeit" aufzurufen. Insbesondere hast du nicht an den Timestamps rumzumachen, da damit ja dann andere Zeitpunkte gemeint sind.

--
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~