daty: Datum in einheitliches Format...

Hi,

habe durch Usereingaben für ein Datum-Feld ganz viele unterschiedliche Eingaben erhalten und würde diese gerne umwandeln, sodass sie einheitlich vorliegen.
(Er)kennt PHP von Haus aus schon einige Formate, oder muss ich jedes einzeln analysieren und Regeln zur Erkennung und Umwandlung festlegen?

Danke

  1. PHP erkennt von Haus aus erst mal gar kein Datumsformat. Du mußt also zunächst ein Regelwerk festlegen, welche Formate wie angegeben werden:

    • Zahlen mit 4 Stellen sind in jedem Fall Jahreszahlen
    • Die Jahreszahl ist in der Regel ganz hinten
    • Zahlen > 12 können keine Monatszahlen sein
    • Wenn die Zahlen mit "-" oder "/" getrennt sind, steht der Monat vor dem Tag-
    • Wenn die Zahlen mit "." getrennt sind, steht der Tag vor dem Monat

    Die RegExp, die zum Erkennen notwendig ist, sieht in etwa so aus:

    /(\d+)([.-/])(\d+)([.-/])(\d+)/

    Jetzt mußt Du Dir noch noch eine Logik überlegen, wie Du die entsprechenden Werte parst.

    Gruß, LX

    --
    RFC 1925, Satz 3: Mit ausreichendem Schub fliegen Schweine wunderbar. (...)
    1. Hi,

      • Wenn die Zahlen mit "-" oder "/" getrennt sind, steht der Monat vor dem Tag-

      Nicht notwendigerweise. In England wird z.B. 29/04/2009 geschrieben, in den USA dagegen 04/29/2009
      Wenn der Tag < 13 ist, ist also nicht entscheidbar, um welche Form es sich handelt.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. In diesem Fall sollte man dem Nutzer die Möglichkeit geben, selbst zu entscheiden. Besser ist jedoch, ein Format vorzugeben, bspw. TT.MM.YYYY und sowohl Client- als auch Serverseitig prüfen zu lassen, ob dieses eingehalten wurde.

        Ggf. kann man die Einhaltung des Formats auch unterstützen, indem man die Felder aufsplittet und beim Erreichen des Feldendes vorne ein entsprechendes Padding einfügt und automatisch zum nächsten Feld springt.

        Gruß, LX

        --
        RFC 1925, Satz 3: Mit ausreichendem Schub fliegen Schweine wunderbar. (...)
      2. Wenn der Tag < 13 ist, ist also nicht entscheidbar, um welche Form es sich handelt.

        Das ist aber nur bedingt ein technisches Problem, auch Menschen wird dies oft schwerfallen (es sei denn eine bestimmte Angabe ist unlogisch, weil sie z.B. nicht in der Zukunft liegen kann oder nicht in der entsprechenden Jahreszeit sein kann...).
        In dem Falle müsste man also schlichtweg raten oder dem Benutzer seinen Kram zurück geben
        Meinten Sie:
        [o]10. April 2009
        [_]4. Oktober 2009

        --
        sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
    2. PHP erkennt von Haus aus erst mal gar kein Datumsformat.

      Sicher doch - damit liest man einfach Pauschal alle Werte anhand eines definierten Formats ein und prüft dann mit checkdate das Datum auf Gültigkeit. Wenn es gültig ist, macht man mit dem nächsten Muster weiter.

      31/01/2008 würde somit beim Format 'd/m/Y' durchkommen, beim Format 'm/d/Y' aber nicht.

      Problematisch sind aber die von MudGuard angesprochenen Fälle.

      • Zahlen mit 4 Stellen sind in jedem Fall Jahreszahlen

      Was ist mit vertippern? z.B. 3101.2009

      • Die Jahreszahl ist in der Regel ganz hinten

      Was ist mit 2009-01-31?

      Die RegExp, die zum Erkennen notwendig ist [...]

      Ein regulärer Ausdruck ist wie gesagt nicht notwendig. PHP stellt ja schon ein paar Funktionen bereit.

      1. »» - Zahlen mit 4 Stellen sind in jedem Fall Jahreszahlen
        Was ist mit vertippern? z.B. 3101.2009

        Vertipper können üblicherweise nicht mehr als valides Format erkannt werden und sollten in jedem Fall als Fehler angezeigt werden.

        »» - Die Jahreszahl ist in der Regel ganz hinten
        Was ist mit 2009-01-31?

        Ausnahmen bestätigen die Regel.

        Die Regexp hat im Gegensatz zum PHP-Datumsparser den Vorteil, dass die Werte nur einmal ausgelesen werden müssen, um alle validen Formate zu erfassen.

        Gruß, LX

        --
        RFC 1925, Satz 3: Mit ausreichendem Schub fliegen Schweine wunderbar. (...)
  2. Hello,

    (Er)kennt PHP von Haus aus schon einige Formate, oder muss ich jedes einzeln analysieren und Regeln zur Erkennung und Umwandlung festlegen?

    Mach doch mal ein paar Versuche mit der Funktion strtotime() und poste uns dann hier das Ergebnis.

    http://de2.php.net/manual/de/function.strtotime.php

    Zum Umwandeln in das Klarschrift-Datumsformat dient dir data()

    http://de2.php.net/manual/de/function.date.php

    Eine Anmerkung noch zu LX's Posting:

    Um zu prüfen, ob das vom User numerisch eingegebene Datum plausibel ist, wäre noch zu prüfen:

    es sollte immer nur eine Art von Trenner vorhanden sein:
      wenn ein '.' drin ist, sollten keine '/' und keine '-' usw vorhanden sein.

    Als Trenner könnte man zulassen  \ / - . ,

    Wenn Trenner vorhanden sind, sollten es immer zwei sein

    Damit müsstest Du, bevor Du strtotime() nutzt, schon einige Fehleingaben abfangen können.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de