Henna: Datum auf Gültigkeit prüfen.

Ich weiß, diese Frage ist bestimmt schon 1000 mal gestellt worden, aber ich habe bis jetzt keine passende Lösung gefunden.

Ich habe ein Textfeld, in welchem ein Datum mit Uhrzeit eingegeben werden soll.
Jetzt möchte ich diese EIngabe auf gültigkeit prüfen. Das Problem ist aber, das es verschiedene Schreibweisen für ein Datum gibt.
Es soll z.B.
2004-12-13 15:34:44
genau so erkannt werden wie
13.12.2004 15:34:44
oder
12/13/2005 15:34:44.

Ist dieses möglich?
Bis jetzt wird es beim Programm im Server geprüft und wenn es nicht gültig war ein Fehler gemeldet. Ich möchte aber schon vor dem absenden der Datn die Eingabe testen.

Gruß Henna

  1. Hallo Henna!

    Lass das Datum doch mittels mehrere Selectboxen eingeben. So stellst Du sicher, dass auch User die aus dem englischsprachigen Raum kommen die Form wahren. Den großen Vorteil den Du zusätzlich hast, ist der, dass du schon von vorne herein nur valide Werte für die Angaben erhälst. Das einzige was Du dann noch tun musst ist ein Check auf valides Datum an sich. Also 31.04., 30.02., Schaltjahre etc. Sonderzeichenbehandlung und andere Werte fallen weg.

    Eventuell gibt es auch irgendwo im Web eine Klasse für JS, die die Validierung dann für dich übernimmt.

    Schönen Gruß

    Afra

    1. Die Idee hatte ich auch schon. Lieder wird dadurch die EIngabe um einige glänger dauern, weil man Tag, Monat, Jahr, Stunde, Minute und Sekunde einzeln anklicken muss.
      Ich hatte mir auch schon überlegt einen Kalender in JS zu implementieren, aber das macht das ganze Form recht voll.
      Eine Eingabe die geprüft wird ist eine möglichkeit die nicht viel Platz braucht und sehr schnell zu bedienen ist. Sechs auswahlfelder sind doch recht umständlich für den Nutzer.
      Sehe ich zumindest so.

      Hallo Henna!

      Lass das Datum doch mittels mehrere Selectboxen eingeben. So stellst Du sicher, dass auch User die aus dem englischsprachigen Raum kommen die Form wahren. Den großen Vorteil den Du zusätzlich hast, ist der, dass du schon von vorne herein nur valide Werte für die Angaben erhälst. Das einzige was Du dann noch tun musst ist ein Check auf valides Datum an sich. Also 31.04., 30.02., Schaltjahre etc. Sonderzeichenbehandlung und andere Werte fallen weg.

      Eventuell gibt es auch irgendwo im Web eine Klasse für JS, die die Validierung dann für dich übernimmt.

      Schönen Gruß

      Afra

      1. Hi,

        Sechs auswahlfelder sind doch recht umständlich für den Nutzer.
        Sehe ich zumindest so.

        Full ACK.

        Lass das Datum doch mittels mehrere Selectboxen eingeben.

        Nein, das ist wahrlich keine gute Idee.

        Gruß,
        Gunnar

        --
        “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
  2. Ich habe ein kleines Skript, dass die Datum- und die Uhrzeiteingabe
    sehr erleichert (es prüft allerdings nicht die Gültigkeit, wie z.B.
    31.2.2005).

    Mich hat es immer gestört, dass man Datumsangaben in einem
    Schema (DD.MM.JJJJ) angeben muss, so dass ich zwei Funktionen
    geschrieben habe, die (fast) alles automatisch korrigieren.

    Z.B.:
      Für 12.02.2005 kann der Benutzer folgendes eingeben:
      12 2, 12.2, 12x2, 12 (wenn der aktuelle Monat der Februar ist),
      12.2.2005, 12 2 05 und sogar 12 2 5.

    Aufgrufen werden die Funktionen mit dem Objekt, dessen Inhalt
    korigiert werden sollen:

      
    function correctDate(pObject)  
    {  
     if (pObject.value==""){return false;}  
      
     var date = new Date();  
     var day = date.getDate();  
     var month = date.getMonth()+1;  
     var year = date.getFullYear();  
      
     if (day.toString().length==1){day = "0"+day;}  
     if (month.toString().length==1){;month = "0"+month;}  
      
     var cDate = pObject.value.replace(/([a-zA-Z \\-\\:\\_\\,\\;])/g,".")+"..";  
     cDate = cDate.split(".");  
      
     var cDay = cDate[0];  
     var cMonth = cDate[1];  
     var cYear = cDate[2];  
      
     if (cDay.length==0){cDay = day}  
     if (cDay.length==1){cDay = "0"+cDay}  
     if (cMonth.length==0){cMonth = month}  
     if (cMonth.length==1){cMonth = "0"+cMonth}  
     if (cYear.length==0){cYear = year}  
     if (cYear.length==1){cYear = "200"+cYear}  
     if (cYear.length==2){cYear = "20"+cYear}  
     if (cYear.length==3){cYear = "200"+cYear.substr(2,1)}  
      
     cDay = cDay.toString().substr(0,2);  
     cMonth = cMonth.toString().substr(0,2);  
     cYear = cYear.toString().substr(0,4);  
      
     if (cDay<1 || cDay>31){cDay = "xx"}  
     if (cMonth<1 || cMonth>12){cMonth = "xx"}  
     if (cYear<2000 || cYear>2100){cYear = "xxxx"}  
      
     pObject.value = cDay+"."+cMonth+"."+cYear;  
    }  
      
    function correctTime(pObject)  
    {  
     if (pObject.value==""){return false;}  
      
     if (pObject.value.length==3)  
     {  
      pObject.value = pObject.value.substr(0,2)+":"+pObject.value.substr(2,2)+"0";  
      return false;  
     }  
     if (pObject.value.length==4)  
     {  
      pObject.value = pObject.value.substr(0,2)+":"+pObject.value.substr(2,2);  
      return false;  
     }  
      
     var cTime = pObject.value.replace(/([a-zA-Z \\-\\:\\_\\,\\;])/g,":")+":";  
     cTime = cTime.split(":");  
     var cHour = cTime[0];  
     var cMinute = cTime[1];  
      
     if (cHour.length==1){cHour = "0"+cHour}  
     if (cMinute.length==0){cMinute = "00"}  
     if (cMinute.length==1){cMinute = "0"+cMinute}  
      
     cHour = cHour.substr(0,2);  
     cMinute = cMinute.substr(0,2);  
      
     if (cHour==24){cHour = "00"}  
     if (cHour<0 || cHour>23){cHour = "xx"}  
     if (cMinute<0 || cMinute>59){cMinute = "xx"}  
      
     pObject.value = cHour+":"+cMinute;  
    }  
    
    

    Bei Fragen einfach nochmal melden.

    1. Hi mark,

      Mich hat es immer gestört, dass man Datumsangaben in einem
      Schema (DD.MM.JJJJ) angeben muss, so dass ich zwei Funktionen
      geschrieben habe, die (fast) alles automatisch korrigieren.

      Und damit zwängst du den Nutzer in ein bestimmtes Schema.

      Für 12.02.2005 kann der Benutzer folgendes eingeben:
        12 2, 12.2, 12x2, 12 (wenn der aktuelle Monat der Februar ist),
        12.2.2005, 12 2 05 und sogar 12 2 5.

      Und was, wenn der Nutzer eine andere Reihenfolge als Tag-Monat-Jahr wählt?

      Ich bevorzuge die sinnvollere und auch in DIN 5008 und ISO 8601 festgeschriebene Jahr-Monat-Tag. [[http://de.wikipedia.org/wiki/Datumsformat@title=Wikipedia: Datumsformat]]

      Gruß,
      Gunnar

      --
      “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
      1. Und damit zwängst du den Nutzer in ein bestimmtes Schema.

        Die Reihenfolge betreffende: Ja. Ja klar, geht ja auch nicht
        anders. Wie soll denn ein Algorhythmus entscheiden was
        mit 01.01.01 gemeint ist?
        Meine Funktion erleichtert nur die Eingabe des Datums. bzw.
        der Zeit. Ich finde es mühselig 12.01.2005 oder 12:00
        einzutippen. Da geht doch 12 1 und 12 viel einfacher
        von der Hand.

        Ich bevorzuge die sinnvollere und auch in DIN 5008 und ISO 8601
        festgeschriebene Jahr-Monat-Tag.

        Sinvoller? Kein Mensch schreibt so das Jahr. Weder in Briefen
        noch in Formularen. Was du mit dem Datum serverseitig machst
        ist eine ganz andere Sache.
        Mein Skript erleichtert die Arbeit.
        Deine Vorgehensweise zwingt die Benutzer deine Faulheit in der
        Datumsbehandlung auszubügeln.

        1. Hi mark,

          Ich bevorzuge die sinnvollere und auch in DIN 5008 und ISO 8601
          festgeschriebene Jahr-Monat-Tag.

          Sinvoller? Kein Mensch schreibt so das Jahr.

          Deine Aussage lässt sich anhand eines Gegenbeispiels ad absurdum führen:
          (1) Ich bin ein Mensch.
          (2) Ich schreibe das Datum immer in der Reihenfolge Jahr-Monat-Tag.

          Weder in Briefen noch in Formularen.

          Sowohl dort als auch dort. Immer.

          Das entspricht ja auch der deutschen Norm [DIN5008]. Nachzulesen in http://de.wikipedia.org/wiki/Datumsformat#DIN_5008

          Deine Vorgehensweise zwingt die Benutzer deine Faulheit in der
          Datumsbehandlung auszubügeln.

          ?? Faulheit? Du meinst meine Korrektheit?

          Gruß,
          Gunnar

          --
          “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
          1. Deine Aussage lässt sich anhand eines Gegenbeispiels ad absurdum führen:
            (1) Ich bin ein Mensch.
            (2) Ich schreibe das Datum immer in der Reihenfolge Jahr-Monat-Tag.

            Das ist umgangssprachlich gemeint gewesen. Das es ein paar Sonderlinge
            gibt ist doch klar. Die meisten Menschen schreiben das Datum
            als Tag.Monat.Jahr.

            Das entspricht ja auch der deutschen Norm [DIN5008]. Nachzulesen in http://de.wikipedia.org/wiki/Datumsformat#DIN_5008

            Dort steht explizit in Systemen der TEXTVERABEITUNG, und das meint
            die Behandlung eines Datum im Backend.

            Im Frontend, speziell Formulare, muss man das Layout IMMER für die
            Benutzer anfertigen (ansonsten kommen solche unverständlichen Formulare,
            wie sie deutsche Ämter anbieten, zustande).

            ?? Faulheit? Du meinst meine Korrektheit?

            Nein, Faulheit!

            Du bist bestimmt auch so ein Typ, der Schraubendreher und
            Gliedermaßstab sagt, anstatt Schraubenzieher und Zollstock.

            Lass gut sein :)

            1. Hi mark,

              Die meisten Menschen schreiben das Datum
              als Tag.Monat.Jahr.

              Mitnichten. Die meisten Menschen sind nicht deutsch.

              Dass die meisten Deutschen noch Tag.Monat.Jahr benutzen, ist leider so. Die Rechtschreibreform wäre die Gelegenheit gewesen, DIN5008:1996 allgemein umzusetzen.

              Dann hätte die Rechtschreibreform neben haufenweise Unfug auch was Gutes geleistet. Aber die Macher hatten nur einen Blick auf die Verhunzung der Wörter, da blieb für die Zahlen kein Blick übrig. Deppen!

              Du bist bestimmt auch so ein Typ, der Schraubendreher und
              Gliedermaßstab sagt, anstatt Schraubenzieher und Zollstock.

              Nö,
              Gunnar

              --
              “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
              1. Hallo.

                Die meisten Menschen sind nicht deutsch.

                Warum verweist du dann auf die _D_IN?
                MfG, at

                1. Hi at,

                  Die meisten Menschen sind nicht deutsch.
                  Warum verweist du dann auf die _D_IN?

                  Weil sich der Absatz, in dem ich das tat, auf Deutsche^W Deutschsprachige bezieht.
                  Gruß,
                  Gunnar

                  --
                  “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
            2. Hallo.

              Faulheit!

              Du bist bestimmt auch so ein Typ, der Schraubendreher und
              Gliedermaßstab sagt, anstatt Schraubenzieher und Zollstock.

              Was ja ein eindeutiges Indiz für Faulheit wäre ...
              MfG, at

        2. Hallo.

          Wie soll denn ein Algorhythmus entscheiden was
          mit 01.01.01 gemeint ist?

          Stimmt, das Jahrhundert wäre aber auch bei einer anderen Reihenfolge nur zu erraten.
          MfG, at

      2. Hallo.

        Ich bevorzuge die sinnvollere und auch in DIN 5008 und ISO 8601 festgeschriebene Jahr-Monat-Tag. [[http://de.wikipedia.org/wiki/Datumsformat@title=Wikipedia: Datumsformat]]

        Um deine Worte zu benutzen:

        Und damit zwängst du den Nutzer in ein bestimmtes Schema.

        MfG, at

        1. Hi at,

          Um deine Worte zu benutzen:

          Und damit zwängst du den Nutzer in ein bestimmtes Schema.

          ??

          Ich will niemanden zwängen. Deshalb sollte ein Formular die Eingabe sowohl als [YY]YY[-]MM[-]DD als auch als DD.MM.[YY]YY zulassen. (Zumindest solange, bis sich das internationale Datumsformat durchgesetzt hat. Und ich fürchte, das dauert …)

          Gruß,
          Gunnar

          --
          “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
    2. Hallo.

      Für 12.02.2005 kann der Benutzer folgendes eingeben:
        12 2, 12.2, 12x2, 12 (wenn der aktuelle Monat der Februar ist),
        12.2.2005, 12 2 05 und sogar 12 2 5.

      Sinnvoll wäre noch die Variante mit Kommata als Trennzeichen, um die alleinige Eingabe über den Ziffernblock zu ermöglichen, sowie die international üblichen Bindestriche und eventuell sogar Schrägstriche. Außerdem wäre es ratsam, Leerzeichen um die Trennzeichen herum ebenfalls abzufangen, denn aus einem "1. Januar" wird ja gern auch mal ein "1. 1.".
      MfG, at

  3. Es soll z.B.
    2004-12-13 15:34:44

    Also:

    yyyy-mm-dd hh:mm:ss

    genau so erkannt werden wie
    13.12.2004 15:34:44

    dd.mm.yyyy hh:mm:ss

    oder
    12/13/2005 15:34:44.

    mm/dd/yyyy hh:mm:ss

    Ist dieses möglich?

    Ja, du musst die eingegebenen Werte spliten und dann die einzelnen Stücke als Werte für ein neues Date Objekt verwenden und dann mit dem ursprungswert vergleichen.

    Bis jetzt wird es beim Programm im Server geprüft und wenn es nicht gültig war ein Fehler gemeldet. Ich möchte aber schon vor dem absenden der Datn die Eingabe testen.

    Im Prinzip sollte das Ähnlich wie auf dem Server funktionieren, nur das dir mit JS keine Funktion strftime zu Verfügung steht.

    Ich hab eine Bibliothek mit ein paar Funktionen
    http://javascript.jstruebig.de/lib/datum.html

    Hier noch eine Version einer JS strftime Funktion
    http://www.innoline-systemtechnik.de/dhgm/zeit.shtml

    Struppi.

  4. Moin!

    Jetzt möchte ich diese EIngabe auf gültigkeit prüfen. Das Problem ist aber, das es verschiedene Schreibweisen für ein Datum gibt.

    Und das Problem ist, uneindeutige Varianten eindeutig zuordnen zu können.

    Angenommen, du hast den 3. Jan. 2005.

    2004-12-13 15:34:44

    2005-01-03

    genau so erkannt werden wie
    13.12.2004 15:34:44

    03.01.2005

    oder
    12/13/2005 15:34:44.

    01/03/2005

    Was aber, wenn jemand das amerikanische Format benutzt, aber keine Schrägstriche einsetzt...

    Was ist, wenn jemand das internationale Format von ganz oben ohne vierstellige Jahreszahl benutzt.

    Die absolute Eindeutigkeit einer Datumsangabe erfolgt immer, wenn die Jahreszahl vierstellig und der Monat als Text(kürzel) ausgegeben wird.

    Ist das Tagesdatum größer als 12, kann der Monat auch als Zahl angegeben werden - die Jahreszahl muß trotzdem vierstellig sein - außer sie ist größer als 31, dann ist auch sie eindeutig als "Jahresangabe" identifizierbar.

    Die Angabe 03-78-16 als Gemischtdatumszahl ist eindeutig als 16. März 78 zuzuordnen, die Frage nach dem Jahrhundert bleibt aber natürlich offen, man kann sich also zweistellige Jahresangaben im Allgemeinen nicht leisten.

    Da du die vorgeschlagenen Select-Listen nicht willst (kann ich gut verstehen, würde ich auch nicht wollen), bliebe als Alternative noch die Möglichkeit, statt eines Textfeldes insgesamt drei für das Datum zu benutzen (nach dem Vollschreiben eines Feldes könnte man per Javascript den Cursor direkt in das nächste Feld setzen, wenn die Eingabe im erforderlichen Zahlenbereich liegt), oder während der Eingabe in dem einzelnen Textfeld arbeitet kontinuierlich eine Javascriptfunktion mit und gibt bei Problemen, mindestens aber bei Uneindeutigkeiten im Datum direkt nach dem Schreiben eine Rückmeldung und fragt ggf. vom Benutzer nochmal ab, welches Datum er genau meinte. Empfehlenswert ist dann, das Datum direkt vor den Augen des Benutzers und vor dem Absenden zum Server in das internationale Format YYYY-MM-DD umzuwandeln.

    • Sven Rautenberg
    1. Hi Sven,

      Die absolute Eindeutigkeit einer Datumsangabe erfolgt immer, wenn die Jahreszahl vierstellig und der Monat als Text(kürzel) ausgegeben wird.

      Der Text in welcher Sprache? Nicht mal alle europäischen Sprachen benutzen aus dem Latein abgeleitete Monatsnamen. Der tschechische květen ist der Mai, der polnische kwiecień der April. So eindeutig ist das wohl nicht.

      Die absolute Eindeutigkeit einer Datumsangabe erfolgt immer, wenn das international Datumsformat [ISO8601] verwendet wird.

      Gruß,
      Gunnar

      --
      “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
    2. Danke erst mal an alle die mir geantwortet haben.
      Ich habe mich jetzt für eine Lösung mit hilfe von Regulären Ausdrücken entschiede. Der Text wird anhand von mehreren Schemen verglichen und daran wird festgemacht ob es sich um eine gültiges Datum handelt.

      Auf dem Server verwende ich weiter die Funktion isDate() (VB-Programm) um dann eine zusetzliche Sicherheit zu haben. Aber die meisten Fehler werde ich schon in der Form abfangen können.

      Gruß Henna

      Moin!

      Jetzt möchte ich diese EIngabe auf gültigkeit prüfen. Das Problem ist aber, das es verschiedene Schreibweisen für ein Datum gibt.

      Und das Problem ist, uneindeutige Varianten eindeutig zuordnen zu können.

      Angenommen, du hast den 3. Jan. 2005.

      2004-12-13 15:34:44

      2005-01-03

      genau so erkannt werden wie
      13.12.2004 15:34:44

      03.01.2005

      oder
      12/13/2005 15:34:44.

      01/03/2005

      Was aber, wenn jemand das amerikanische Format benutzt, aber keine Schrägstriche einsetzt...

      Was ist, wenn jemand das internationale Format von ganz oben ohne vierstellige Jahreszahl benutzt.

      Die absolute Eindeutigkeit einer Datumsangabe erfolgt immer, wenn die Jahreszahl vierstellig und der Monat als Text(kürzel) ausgegeben wird.

      Ist das Tagesdatum größer als 12, kann der Monat auch als Zahl angegeben werden - die Jahreszahl muß trotzdem vierstellig sein - außer sie ist größer als 31, dann ist auch sie eindeutig als "Jahresangabe" identifizierbar.

      Die Angabe 03-78-16 als Gemischtdatumszahl ist eindeutig als 16. März 78 zuzuordnen, die Frage nach dem Jahrhundert bleibt aber natürlich offen, man kann sich also zweistellige Jahresangaben im Allgemeinen nicht leisten.

      Da du die vorgeschlagenen Select-Listen nicht willst (kann ich gut verstehen, würde ich auch nicht wollen), bliebe als Alternative noch die Möglichkeit, statt eines Textfeldes insgesamt drei für das Datum zu benutzen (nach dem Vollschreiben eines Feldes könnte man per Javascript den Cursor direkt in das nächste Feld setzen, wenn die Eingabe im erforderlichen Zahlenbereich liegt), oder während der Eingabe in dem einzelnen Textfeld arbeitet kontinuierlich eine Javascriptfunktion mit und gibt bei Problemen, mindestens aber bei Uneindeutigkeiten im Datum direkt nach dem Schreiben eine Rückmeldung und fragt ggf. vom Benutzer nochmal ab, welches Datum er genau meinte. Empfehlenswert ist dann, das Datum direkt vor den Augen des Benutzers und vor dem Absenden zum Server in das internationale Format YYYY-MM-DD umzuwandeln.

      • Sven Rautenberg