Matthias Apsel: Datumsverwirrung

Om nah hoo pez nyeetz, alle!

Ich wollte mal ausprobieren, wie diverse Programmiersprachen auf die Eingabe eines plausiblen, jedoch falschen Datums, beispielsweise den 29.2.2013 reagieren.

Das Ergebnis verwirrt mich sehr.

Ich hatte erwartet, durch eine Angabe von bald = new Date(2014,0,29) das Datum des 29. Januars 2014 zu erhalten. Offensichtlich ist das nicht so -

Wer kann Licht ins dunkle bringen?

Matthias

--
1/z ist kein Blatt Papier.

  1. Hallo,

    Ich wollte mal ausprobieren, wie diverse Programmiersprachen auf die Eingabe eines plausiblen, jedoch falschen Datums, beispielsweise den 29.2.2013 reagieren.
    Das Ergebnis verwirrt mich sehr.

    inwiefern?

    Ich hatte erwartet, durch eine Angabe von bald = new Date(2014,0,29) das Datum des 29. Januars 2014 zu erhalten. Offensichtlich ist das nicht so -

    Doch, ist es. Hast du eventuell nicht daran gedacht, dass der Monat im JS-Date-Objekt von 0..11 zählt, also 0 der Januar ist, 1 der Februar, und 12 aufgrund der internen Korrektur schon auf den Januar des Folgejahres abgebildet wird?

    Wer kann Licht ins dunkle bringen?

    Ich hab's zumindest probiert. Wenn ich falsch liege, weiß ich nicht, wo deine Dunkelheit liegt.

    Ciao,
     Martin

    --
    Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hi!

    Was verwirrt dich? Ich hab mal meine Javascriptkonsole bemueht:

    bald = new Date(2014,0,29)  
    alert(bald)
    

    Das Ergebnis: Wed Jan 29 00:00:00 UTC+0100 2014
    Genau, was Du erwartet hast, oder nicht?

    --
    Signaturen sind blöd!
    1. Om nah hoo pez nyeetz, Steel!

      [code lang=javascript]bald = new Date(2014,*0*,29)

      Das Ergebnis: ... *Jan* ...

      Genau, was Du erwartet hast,

      Ja.

      Ich hatte es auch bei getMonth(erwartet), aber getMonth rechnet nicht selbstständig + 1.

      Dann wird auch aus einem 29. Februar 2013 der 1. März 2013.

      und alles ist gut.

      Matthias

      --
      1/z ist kein Blatt Papier.

      1. hi,

        Dann wird auch aus einem 29. Februar 2013 der 1. März 2013.
        und alles ist gut.

        Nein, das ist nicht gut. Das Datum 29.2.2013 ist UNGÜLTIG!!!!!

        Entschuldige, wenn ich hier so reinplatze, aber Ordnung muss sein. Wo khämen wir denn hin, wenn ein jeder ein Datum angeben kann wie er gerade lustisch ist, dem gehöhrt auf die Finger geglopft! Und eine ordentliche Fehlermeldung um die Ohrs gehauhen, jawoll ;)

        SCNR; Hotti

        1. Tach!

          Das Datum 29.2.2013 ist UNGÜLTIG!!!!!
          Entschuldige, wenn ich hier so reinplatze, aber Ordnung muss sein. Wo khämen wir denn hin, wenn ein jeder ein Datum angeben kann wie er gerade lustisch ist, dem gehöhrt auf die Finger geglopft! Und eine ordentliche Fehlermeldung um die Ohrs gehauhen, jawoll ;)

          Es kommt drauf an. Wenn ein gültiges Datum erwartet wird, ist das natürlich nicht zulässig. Aber Javascripts und anderer Systeme Date-Funktionen erwarten der Einfachheit halber kein exakt gültiges Datum. Denn somit können Rechnungen durch einfaches Addieren von Werten durchgeführt werden. Tag 27 eines Monats plus 7 Tage kann man gleich bei Anlegen des Date-Objekts mit Date(jahr, monat, 27 + 7) in einem Schritt erreichen.

          dedlfix.

          1. Moin!

            Es kommt drauf an. Wenn ein gültiges Datum erwartet wird, ist das natürlich nicht zulässig. Aber Javascripts und anderer Systeme Date-Funktionen erwarten der Einfachheit halber kein exakt gültiges Datum. Denn somit können Rechnungen durch einfaches Addieren von Werten durchgeführt werden. Tag 27 eines Monats plus 7 Tage kann man gleich bei Anlegen des Date-Objekts mit Date(jahr, monat, 27 + 7) in einem Schritt erreichen.

            Ja. Wenn man eine exakte Angabe braucht muss man das neue Datum mit dem eingegebenen vergleichen. Wenn z.b. nach Eingabe von 29.02.2013 der Tag ploetzlich 1 und oder der Monat ploetzlich 2 ist, stimmte vorher was nicht. Dann kann man Alarm geben. "Ey, Lutscher! Gib nen vernuenftiges Datum an und lueg Dir keinen Scheiss zusammen!"

            --
            Signaturen sind blöd!
            1. hi,

              Ja. Wenn man eine exakte Angabe braucht muss man das neue Datum mit dem eingegebenen vergleichen. Wenn z.b. nach Eingabe von 29.02.2013 der Tag ploetzlich 1 und oder der Monat ploetzlich 2 ist, stimmte vorher was nicht. Dann kann man Alarm geben. "Ey, Lutscher! Gib nen vernuenftiges Datum an und lueg Dir keinen Scheiss zusammen!"

              Echt krass Ey ;)

              Aber mal ernsthaft: Eine automatische Korrektur ist immer dann schlecht, wenn es um Benutzereingaben geht. Denn so wird ein Fehler gar nicht, oder erst viel später bemerkt und im kleinsten Fall ist das Ergebnis nicht erwartungsgemäß.

              Hotti

              1. Tach!

                Eine automatische Korrektur ist immer dann schlecht, wenn es um Benutzereingaben geht. Denn so wird ein Fehler gar nicht, oder erst viel später bemerkt und im kleinsten Fall ist das Ergebnis nicht erwartungsgemäß.

                Dann hat der Programmierer einen Fehler gemacht, wenn er die dokumentierten Eigenheiten der von ihm verwendeten Funktionen nicht berücksichtigt und dann davon ausgeht, dass das System zur Prüfung der Benutzereingaben ausreichend wäre. Zudem hat er seine Tests nicht mit ausreichend ungültigen Werten gemacht, sonst wäre ihm das zeitnah aufgefallen.

                dedlfix.

        2. Om nah hoo pez nyeetz, hotti!

          Entschuldige, wenn ich hier so reinplatze,

          entschuldige, wenn ich jetzt erst antworte:

          aber Ordnung muss sein. Wo khämen wir denn hin, wenn ein jeder ein Datum angeben kann wie er gerade lustisch ist, dem gehöhrt auf die Finger geglopft! Und eine ordentliche Fehlermeldung um die Ohrs gehauhen, jawoll ;)

          Dieses Weiterrechnen um einen Tag ist aber ein "wohldefiniertes Verhalten", auf das ich reagieren kann. Ich weiß also, ich muss also nur die "ersten Märze" prüfen, ob sie nicht vielleicht "29. Februare" sein sollen.

          Matthias

          --
          1/z ist kein Blatt Papier.

          1. hi,

            Dieses Weiterrechnen um einen Tag ist aber ein "wohldefiniertes Verhalten", auf das ich reagieren kann. Ich weiß also, ich muss also nur die "ersten Märze" prüfen, ob sie nicht vielleicht "29. Februare" sein sollen.

            Programiertechnich keine Frage ;)

            Eine 'Tagesformel' like jd = jd(d,m,y) rechnet stur und prüft nicht, einer solchen Formel kannst Du Datum-Angaben wie d(76), m(25), y(13) übergeben und bekommst einen fortlaufenden Tag.

            Die Prüfung, ob das übergebene Datum gültig ist? Ganz einfach, rechne zurück! Dazu brauchst Du eine Formel like (d,m,y) = dmy(jd), im Ergebnis dessen müssen für ein gültiges Datum d', m' und y' gleich d, m, y sein.

            Sofern die von mir genannten fiktiven Funktionen jd() und dmy() die Schaltjahresregelung berücksichtigen, vereinfacht das auch die Prüfung auf ein Schaltjahr: Ein solches liegt vor, wenn jd(29,2,y) und jd(1,3,y) unterschiedliche Ergebnisse liefern. Und schließlich haben jd() sowie dmy() eine Epoche, in der sie gültig sind, so ergibt modulo jd den Wochentag.

            So einfach kann das Rechnen mit dem Datum sein ;)

            Hotti

            1. @@hotti:

              nuqneH

              […] vereinfacht das auch die Prüfung auf ein Schaltjahr: Ein solches liegt vor, wenn jd(29,2,y) und jd(1,3,y) unterschiedliche Ergebnisse liefern.

              Aber das geht doch einfacher. ;-) SCNR.

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. Om nah hoo pez nyeetz, Gunnar Bittersmann!

                Aber das geht doch einfacher. ;-) SCNR.

                Auf den Link hab ich schon gewartet. ;-)

                OT: Hast du einen Plan, warum der IE8 aus einem großen ß ein Doppel-S macht? Nicht, dass mich es stören würde ...

                Matthias

                --
                1/z ist kein Blatt Papier.