Hallo ursus,
nicht mein Minus, aber ich denke, im Falle des string-Zweigs bist Du tatsächlich zu leichtsinnig. Man sollte ein paar Datumsformate verstehen, oder zumindest sicher sein, dass der String ein ISO-Datum ist bevor man ihn als solches interpretiert.
D.h. man sollte die Formate "yyyy-mm-dd", "yy-mm-dd", "dd.mm.yy und "dd.mm.yyyy" prüfen, und vielleicht noch "mm/dd/yyyy" und "mm/dd/yy". Ich weiß, dass das nicht sehr zuverlässig ist, aber besser als blindlings GIGO anzuwenden und yyyy-mm-dd zu unterstellen.
D.h.
function date2german($date = false)
{
switch (gettype($date))
{
case 'boolean':
return date('d.m.y');
case 'integer':
return date('d.m.y', $date);
case 'string':
$yearOffs = strlen($date) == 8 ? 0 : 2;
$fmtDate = function($s, $d, $m, $y) {
return substr($s, $d, 2).".".substr($s, $m, 2).".".substr($s, $y, 2);
};
// yy-mm-dd oder yyyy-mm-dd
if ($date[$yearOffs+2] == "-" && $date[$yearOffs+5] == "-")
return $fmtDate($date, $yearOffs+6, $yearOffs+3, $yearOffs);
// dd.mm.yy oder dd.mm.yyyy
if ($date[2] == "." && $date[5] == ".")
return $fmtDate($date, 0, 3, $yearOffs+6);
// mm/dd/yy oder mm/dd/yyyy
if ($date[2] == "/" && $date[5] == "/")
return $fmtDate($date, 3, 0, $yearOffs+6);
}
trigger_error("function date2german: Typ für '$date' nicht implementiert.",
E_USER_NOTICE);
return false;
}
function test($input)
{
echo "$input -> <" . date2german($input) . ">\n";
}
test(false);
test(time());
test("1.4.17");
test("01.04.17");
test("01.04.2017");
test("01/04/17");
test("01/04/2017");
test("17-04-01");
test("2017-04-01");
Wobei man das noch mit Regexen ausfeilen kann…
function date2german($date = false)
{
switch (gettype($date))
{
case 'boolean':
return date('d.m.y');
case 'integer':
return date('d.m.y', $date);
case 'string':
// yy-mm-dd oder yyyy-mm-dd
// dd.mm.yy oder dd.mm.yyyy
// mm/dd/yy oder mm/dd/yyyy
if (preg_match("/^(?<year>\d\d?|\d{4})-(?<month>\d\d?)-(?<day>\d\d?)$/", $date, $matches) ||
preg_match("/^(?<day>\d\d?)\.(?<month>\d\d?)\.(?<year>\d\d?|\d{4})$/", $date, $matches) ||
preg_match("/^(?<month>\d\d?)\/(?<day>\d\d?)\/(?<year>\d\d?|\d{4})$/", $date, $matches)
)
return str_pad($matches['day'], 2, STR_PAD_LEFT)
. "." . str_pad($matches['month'],2,STR_PAD_LEFT)
. "." . str_pad($matches['year'],2,STR_PAD_LEFT);
trigger_error("function date2german: '$date' hat unbekanntes Format.",
E_USER_NOTICE);
return false;
}
trigger_error("function date2german: Typ für '$date' nicht implementiert.",
E_USER_NOTICE);
return false;
}
function test($input)
{
echo "$input -> <" . date2german($input) . ">\n";
}
test(false);
test(time());
test("1.4.7");
test("1.4.17");
test("01.04.17");
test("01.04.217");
test("01.04.2017");
test("1/4/7");
test("01/04/17");
test("01/04/217");
test("01/04/2017");
test("7-04-1");
test("17-4-1");
test("2017-4-01");
test("217-04-01");
test("2017-04-01");
Rolf
--
sumpsi - posui - clusi
sumpsi - posui - clusi