raw-venture-ad: Datum um 1 Tag erhöhen

Hallo!

Ich bin nahe am Verzweifeln, Folgendes:

Die Zielsetzung ist, aus einem Input-Feld ein Datum auszulesen, und dieses um einen Tag zu erhöhen.

Hier mein Code dafür:

var obj = document.getElementById("MyDateField");
var arr_date = obj.value.split(".");
var obj_date = new Date(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]));
var int_date = Date.parse(obj_date);
var oneday = 86400000;
var int_date_neu = int_date + oneday;

Das funktioniert auch perfekt (Ich führe dies in einer Schleife -mit setTimeout- aus solange der User einen Button gedrückt hält).

Jedoch bleibt das Script einfach stehen, wenn ich den 26.10.2008 erreiche. Ich weiß, dass der 26.10.2008 der Anfang der Winterzeit ist. Dasselbe passiert beim 28.10.2007 (Winterzeit letztes Jahr). Wie kann ich dieses Problem denn lösen?

Bitte um Hilfe !
DANKE!

Viele Grüße

Matthias

  1. Hi,

    Jedoch bleibt das Script einfach stehen, wenn ich den 26.10.2008 erreiche. Ich weiß, dass der 26.10.2008 der Anfang der Winterzeit ist. Dasselbe passiert beim 28.10.2007 (Winterzeit letztes Jahr).

    Du hast vielen, die auf dieses Problem stoßen, etwas voraus.

    Wie kann ich dieses Problem denn lösen?

    Indem Du das Datum mit einer Uhrzeit erzeugst, welche signifikant von Mitternacht abweicht. Es hat sich hierzu 3 Uhr eingebürgert.

    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. Besten Dank ihr beiden  @Cheatah und ChrisB !

      Habe es jetzt so gelöst (fürs Archiv und die Suche ;-) ):
      var obj_date = new Date(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]),3,0,0);

    2. Hallo Cheatah,

      Wie kann ich dieses Problem denn lösen?

      Indem Du das Datum mit einer Uhrzeit erzeugst, welche signifikant von Mitternacht abweicht. Es hat sich hierzu 3 Uhr eingebürgert.

      Das halte ich für suboptimal. Wenn, dann würde ich 12 Uhr mittags nehmen, denn dann ist eigentlich in keinem Land Umstellung (wäre mir zumindest nicht bekannt), d.h. ob man da ein oder zwei Stunden vor oder zurück geht, ist relativ egal. Bei 3 Uhr handelt man sich genau dann Probleme ein, wenn die Uhrzeit z.B. in einem anderen Land später als hier um 2 Uhr umgestellt wird (und wer weiß, welche verrükte Zeitzone der Rechner gerade eingestellt hat, an dem der User sitzt, selbst wenn die Webseite sich an Bewohner Deutschlands richtet, kann jemand ja in einem Internet-Café im Urlaub sitzen).

      Andererseits finde ich die Variante, direkt nur im Datum rumzurechnen, schöner, weil man sich dann wirklich nicht um Zeitumstellungen Gedanken machen muss.

      Als weitere Alternative bietet sich außerdem noch an, mit Date.UTC zu rechnen, denn UTC kennt keine Zeitumstellungen:

      var int_date = Date.UTC(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]));  
      var int_date_neu = int_date + 86400000;  
      var obj_date_neu = new Date (int_date_neu);  
      // zugriff jetzt aber nicht mehr über getMonth, sondern über getUTCMonth  
      // usw. usf. da wir hier NICHT in Lokalzeit rechnen
      

      (Siehe auch etliche Forumspostings von mir im Archiv zu der gleichen Problematik in PHP, Python, etc.)

      Viele Grüße,
      Christian

      1. Hallo!

        var int_date = Date.UTC(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]));

        Oh, übrigens, mir fällt gerade auf, gilt genauso auch für die new Date()-Geschichte:

        JavaScript erwartet für den Monat einen Wert zwischen 0 und 11 und nicht zwischen 1 und 12! Tappe ich schon wieder in diese blöde Falle.

        Korrekt wäre also (zusammen mit der anderen Anmerkung zu parseInt, die ich auch übersehen hatte):

        var int_date = Date.UTC(parseInt(arr_date[2], 10),parseInt(arr_date[1], 10) - 1,parseInt(arr_date[0], 10));

        (Die new Date()-Geschichte müsste natürlich auch entsprechend angepasst werden.)

        Viele Grüße,
        Christian

  2. Hi,

    Jedoch bleibt das Script einfach stehen, wenn ich den 26.10.2008 erreiche. Ich weiß, dass der 26.10.2008 der Anfang der Winterzeit ist. Dasselbe passiert beim 28.10.2007 (Winterzeit letztes Jahr). Wie kann ich dieses Problem denn lösen?

    Indem du wirklich einen Tag addierst, und nicht die Anzahl Sekunden, die zwar "meistens", aber eben nicht immer, einer Tageslaenge entsprechen.

    Schon in dieser Zeile

    var obj_date = new Date(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]));

    kannst du gerne 1 auf den Tag draufaddieren.
    Das Date-Objekt kommt auch damit klar, wenn du dich damit aus dem "gueltigen Rahmen" der Tagesanzahl eines Monats herausbewegst - es liefert dann einfach den ersten Tag des naechsten Monats.

    MfG ChrisB

    1. Hi,

      Jedoch bleibt das Script einfach stehen, wenn ich den 26.10.2008 erreiche. Ich weiß, dass der 26.10.2008 der Anfang der Winterzeit ist. Dasselbe passiert beim 28.10.2007 (Winterzeit letztes Jahr). Wie kann ich dieses Problem denn lösen?

      Indem du wirklich einen Tag addierst, und nicht die Anzahl Sekunden, die zwar "meistens", aber eben nicht immer, einer Tageslaenge entsprechen.

      Das sollte in diesem Fall keine Rolle spielen, da das interne Datum in GMT behandelt wird.
      Natürliche gebe ich Dir Recht, dass ein date.setDate(date.getDate()+1) besser wär.

      • Martin
      1. Hallo Martin,

        Indem du wirklich einen Tag addierst, und nicht die Anzahl Sekunden, die zwar "meistens", aber eben nicht immer, einer Tageslaenge entsprechen.

        Das sollte in diesem Fall keine Rolle spielen, da das interne Datum in GMT behandelt wird.

        Nein! Natürlich ist kennt GMT / UTC keine Zeitumstellung, aber wenn Du z.B. das Datum "30. März 2008, 00:59:59 UTC" betrachtest, dann ist das "30. März 2008, 01:59:59 CET" in Lokalzeit (Deutschland), eine Sekunde später, "30. März 2008, 01:00:00 UTC" ist dagegen in Lokalzeit "30. März 2008, 02:00:00 CEST".

        Wenn Du also auf den 29. März 2008 23:59:59 Lokalzeit genau 86400 Sekunden addierst, dann wirst Du den 31. März 2008 00:59:59 Lokalzeit erhalten - und nicht den 30. März 2008 23:59:59 Lokalzeit!

        Viele Grüße,
        Christian

        1. Hallo Martin,

          Indem du wirklich einen Tag addierst, und nicht die Anzahl Sekunden, die zwar "meistens", aber eben nicht immer, einer Tageslaenge entsprechen.

          Das sollte in diesem Fall keine Rolle spielen, da das interne Datum in GMT behandelt wird.

          Nein! Natürlich ist kennt GMT / UTC keine Zeitumstellung, aber wenn Du z.B. das Datum "30. März 2008, 00:59:59 UTC" betrachtest, dann ist das "30. März 2008, 01:59:59 CET" in Lokalzeit (Deutschland), eine Sekunde später, "30. März 2008, 01:00:00 UTC" ist dagegen in Lokalzeit "30. März 2008, 02:00:00 CEST".

          Wenn Du also auf den 29. März 2008 23:59:59 Lokalzeit genau 86400 Sekunden addierst, dann wirst Du den 31. März 2008 00:59:59 Lokalzeit erhalten - und nicht den 30. März 2008 23:59:59 Lokalzeit!

          Mmh, ja.
          Ich habe - glaub ich - nicht bedacht, dass der Constructor vom Date die Parameter als Lokalzeit interpretiert, was man an dem Beispiel recht gut sehen kann.
          new Date(2002,1,2).toGMTString()
          ergibt: Fri, 01 Feb 2002 23:00:00 GMT

          Danke

          • Martin
  3. Hallo,

    var arr_date = obj.value.split(".");
    var obj_date = new Date(parseInt(arr_date[2]),parseInt(arr_date[1]),parseInt(arr_date[0]));

    sollte Tag und Monat mit führender "0" notiert sein, dürftest du nicht mit jedem Browser ein korrektes Ergebnis erhalten: http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#parse_int

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·