Datum parsen und in MySQL-Format bringen
am 29.08.2006 13:42:21 von Helmuth GronewoldHallo Newsgroup,
ich habe eine kleine Methode geschrieben, um ein Datum in das allgemeine
MySQL-Format(2006-08-29) zu wandeln.
Ich frage mich, ob man so etwas nicht noch eleganter lösen könnte.
Gerade bei Fall 1 hatte ich meine Probleme.
Bei meinem ersten Versuch sah das Pattern so aus:
§([\d]{1,2})\.([\d]{1,2})\.([\d]{2})[^\d]*§is
Das hat bei '05.05.06' prima funktioniert, aber leider auch '05.05.2006'
gematcht.
Durch tauschen von [^\d]* durch $ funktioniert es jetzt.
Ich benutze [\d] anstatt [0-9] oder anderen konstrukten, da ich weiß,
dass eine Angabe wie 99.00.99 oder 22.22.4000 nicht vorkommt.
Ich glaube ausserdem, dass der Code wieder zu unübersichtlich
wird wenn ich so etwas prüfe.
Leider sieht der Code hier in der Newsgroup etwas doof aus.
Für die, die es lieber besser formatiert (na gut, die Tabulatoren
sind nicht exakt so wie bei mir im Quanta) und mit Syntaxhighlighting
haben, habe ich die Methode auch noch mal online:
http://cisa85.de/tmp/parseDateToMySQL.phps
Ich danke allen schon jetzt für Kritik und Verbesserungsvorschläge. ;)
Gruß,
Helmuth
--------------------------------snip------------------------ ---------
public static function parseDateToMySQL ($dateString) {
$monthsInt = array ('01', '02', '03', '04', '05', '06',
'07', '08', '09', '10', '11', '12');
$monthsStrLong = array ('Januar', 'Februar',
'März', 'April',
'Mai', 'Juni',
'Juli', 'August',
'September', 'Oktober',
'November', 'Dezember');
$monthsStrShort = array ('Jan', 'Feb', 'Mär',
'Apr', 'Mai', 'Jun',
'Jul', 'Aug', 'Sep',
'Okt', 'Nov', 'Dez');
$monthsOrLong = implode ('|', $monthsStrLong);
$monthsOrShort = implode ('|', $monthsStrShort);
$formats = array (
'§([\d]{1,2})\.([\d]{1,2})\.([\d]{2})$§is', // (0)5.12.06
'§([\d]{1,2})\.([\d]{1,2})\.([\d]{4})§is', // (0)5.12.2006
"§([\d]{1,2})[\.]* ($monthsOrLong) (\d\d\d\d)§is",// (0)5(.) Dezember 2006
"§([\d]{1,2})[\.]* ($monthsOrShort) (\d\d\d\d)§is",// (0)5(.) Dez 2006
"§([\d]{1,2})[\.]* ($monthsOrLong)§is", // (0)5(.) Dezember
"§([\d]{1,2})[\.]* ($monthsOrShort)§is", // (0)5(.) Dez
'§([\d]{1,2})/([\d]{1,2})/([\d]{2,2})§is',// 12/05/06
'§(\d\d\d\d-\d\d-\d\d)§is' // 2006-12-05
);
// (0)5.12.06
if (preg_match ($formats[0], $dateString, $match))
return '20' . $match[3] . '-' . $match[2] . '-' . $match[1];
// (0)5.12.2006
else if (preg_match ($formats[1], $dateString, $match))
return $match[3] . '-' . $match[2] . '-' . $match[1];
// (0)5(.) Dezember 2006
else if (preg_match ($formats[2], $dateString, $match))
return $match[3] . '-' . str_replace ($monthsStrLong, $monthsInt,
$match[2]) . '-' . $match[1];
// (0)5(.) Dez 2006
else if (preg_match ($formats[3], $dateString, $match))
return $match[3] . '-' . str_replace ($monthsStrShort, $monthsInt,
$match[2]) . '-' . $match[1];
// (0)5(.) Dezember
else if (preg_match ($formats[4], $dateString, $match))
return date ('Y') . '-' . str_replace ($monthsStrLong, $monthsInt,
$match[2]) . '-' . $match[1];
// (0)5(.) Dez
else if (preg_match ($formats[5], $dateString, $match))
return date ('Y') . '-' . str_replace ($monthsStrShort, $monthsInt,
$match[2]) . '-' . $match[1];
// 12/05/06
else if (preg_match ($formats[6], $dateString, $match))
return '20' . $match[3] . '-' . $match[1] . '-' . $match[2];
// 2006-12-05
else if (preg_match ($formats[7], $dateString, $match))
return $match[1];
// crap data!
else
return FALSE;
} // parseDateToMySQL
--------------------------------snap------------------------ ---------