Datum in einheitliches Format...
daty
- php
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
PHP erkennt von Haus aus erst mal gar kein Datumsformat. Du mußt also zunächst ein Regelwerk festlegen, welche Formate wie angegeben werden:
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
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
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
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
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.
»» - 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
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