Internationale Datumseingabe gewährleisten

Hallo

welche Möglichkeiten gibt es denn, in PHP ein durch Menschen eingegebenes Datum zu parsen. Mir schwebt eine international gültige Allgemeinlösung vor, die - je nach Locale - entsprechende Datumseingaben erwartet.

Sie sollte also mit YYY-MM-DD genauso gut klarkommen wie mit DD.MM.YYYY und mm/dd/yyyy etc pp.

Gibt es hier bereits Lösungen? In php 5.1. RC1 wurde laut www.php.net eine strptime()-Funktion eingebaut, welche hier Abhilfe schaffen soll. Die kann ich aber im gegenwärtigen Umfeld noch nicht nutzen, da sie nicht vorliegt.

Die PEAR-Date-Klasse wiederum erwartet ISO-Eingaben, welche nicht den deutschen Datumsformaten entspricht.

Bin für jeden Tipp dankbar!

Grüße, Hagen

warum prüfst Du nicht selbst auf gültigkeit oder Format und stellst notfalls um…?

Ich meine wenn Du -, / oder . als Trennzeichen verwenden kannst um zu identifizieren kannst, dann kannst Du auch sagen was nun monat, und was tag ist - beim Jahr ist es solange es nicht zweistellig eingegeben wird ja auch noch recht einfach zu unterscheiden…

bei einem 04/05/06 als Beispiel wird es für mich schwerer zu erkennen, was das nun sein soll…
letztlich gibt es nur dann Sicherheit, wenn man für alles separate Eingabefelder hat und auch wenn ich dropdowns nicht mag - sie haben ihren Sinn :wink:

Hallo,

genau das ist auch sozusagen Plan B.

Allerdings dachte ich mir, das es innerhalb der letzten 6 Jahre bestimmt noch einige andere Leute gegeben haben wird, die das gleiche Problem hatten, und somit u.U. irgendwo eine Klasse oder zumindest eine Funktion existiert, die entsprechende Aufgabe einheitlich verrichtet.
:wink:

Grüße, Hagen

naja…
es gibt immernoch

checkdate()
checkdate – Prüft ein gregorianisches Datum auf Gültigkeit
Beschreibung:
bool checkdate ( int Monat, int Tag, int Jahr)

Ist das angegebene Datum gültig, wird TRUE zurückgegeben, ansonsten FALSE. Prüft die Gültigkeit der angebenen Datumswerte. Ein Datum wird als gültig angesehen, wenn

das Jahr zwischen 1 und 32767 (inklusive) ist,

der Monat zwischen 1 und 12 (inklusive) ist und

der Tag innerhalb der erlaubten Werte des angegebenen Monats ist. SchaltJahre werden berücksichtigt.

Siehe auch mktime() und strtotime().

zusatz…
ich würd das dann so machen:

$date = explode("-",$datum);
if (count($date) == 3)
 {
 $day = $date[0];
 $mon = $date[1];
 $yea = $date[2];
 }

$date = explode("/",$datum);
if (count($date) == 3)
 {
 $day = $date[1];
 $mon = $date[2];
 $yea = $date[0];
 }

$date = explode(".",$datum);
if (count($date) == 3)
 {
 $day = $date[2];
 $mon = $date[1];
 $yea = $date[0];
 }

if (!checkdate($mon,$day,$yea)) die("falsches Datumsformat");

die simplität macht da eine Klasse wohl unnötig :wink:
Und vor allem kann man sich die trennzeichen ja normal selbst aussuchen also sind viele Klassen vielleicht eh sinnlos…
Ist ja eher ein Ding des Landesstandards.
Hier schreibt man Datum meist mit Punkten - in Amerika nicht…

Hallo

das nützt nichts.
Bei deinem Beispiel würde ein replace auf „-“ nach „/“ und von „/“ nach „.“ völlig ausreichen.

Viel wichtiger ist an dieser Stelle, welcher Datumspart kommt, und genau hier besteht das gegenwärtige Schlüsselproblem:

Wenn der „-“ als Trenner verwendet wird, ist anzunehmen, das das Datum nicht etwa in Form von „dd-mm-yyyy“ angegeben wurde, sondern „yyyy-mm-dd“ ist viel wahrscheinlicher. Oder gar „yyyy-dd-mm“?

Bei der Verwendung von „/“ könnte auch hier das angelsächsische Format gelten „mm/dd/yyyy“ oder gar „dd/mm/yyyy“

Diese Problematik gibt es zu bewältigen.

Vermutlich überlasse ich es dem User in seinem Userprofil, welche Variante er bevorzugt. Dann weiß ich, an welcher Stelle welcher Datumspart wo steht…

:wink:
Grüße, Hagen

Hallo

das nützt nichts.
Bei deinem Beispiel würde ein replace auf „-“ nach „/“ und von
„/“ nach „.“ völlig ausreichen.

da hast Du was falsches gelesen.
Achte mal auf die Zahlen in den eckigen klammern - die ändern sich nämlich und das ist der springende Punkt…

Bei der Verwendung von „/“ könnte auch hier das
angelsächsische Format gelten „mm/dd/yyyy“ oder gar
„dd/mm/yyyy“

das ist das wesentliche Problem!
Da musst Du Dir was ausdenken weil ein 6. September könnte eben genauso ein 9. Juni sein.
Da MUSST Du was vorgeben - automatisch ist da nix zu machen weil beides gültige Daten sind.

Diese Problematik gibt es zu bewältigen.

normalerweise reicht eine Formatforgabe aus.

Vermutlich überlasse ich es dem User in seinem Userprofil,
welche Variante er bevorzugt. Dann weiß ich, an welcher Stelle
welcher Datumspart wo steht…

sprich dass der User auch noch angeben muss wie er sein Datum angegeben hat? find ich doof… :stuck_out_tongue:

Hallo

Da musst Du Dir was ausdenken weil ein 6. September könnte
eben genauso ein 9. Juni sein.
Da MUSST Du was vorgeben - automatisch ist da nix zu machen
weil beides gültige Daten sind.

Vermutlich überlasse ich es dem User in seinem Userprofil,
welche Variante er bevorzugt. Dann weiß ich, an welcher Stelle
welcher Datumspart wo steht…

sprich dass der User auch noch angeben muss wie er sein Datum
angegeben hat? find ich doof… :stuck_out_tongue:

Meinst du?
Man könnte ein striktes Datumsformat vorgeben, aber andererseits ist es doch auch elegant für den User, wenn er das vorgegebene Datum speziell für sich entsprechend ändern kann.

Folgende Formate verursachen vermutlich keine Probleme:

dd.mm.yyyy

und yyyy-mm-dd

Aber bei dd/mm/yyyy und mm/dd/yyyy gibt es halt verschiedene Gewohnheiten jeweiliger Regionen und Sprachen. Hier wäre die Möglichkeit, das verwendete Datumsformat beeinflussen zu können, sicher erwünscht.

(Es handelt sich im vorliegenden Fall um eine Anwendung, bei der recht häufig Datums- und Zeiteingaben manuell vorgenommen werden)

Aber das ist sicher Geschmackssache.


Ich bau mir ne Funktion, die eine solche Eingabe anhand des Musters (d/m/y etc) entsprechend interpretiert.

Danke für deine Anregungen!

:wink:
Grüße, Hagen