Ich möchte es dem User ermöglichen "einfache" Datumseingaben zu machen.
So der grundsätziche Plan:
Dazu Folgende Funktion weiter unten. Frage dazu: Ist es "richtig" für die Rangeprüfung noch eine eigene Funktion zu machen?
Speziell ob bei zB diesen Werten nicht schon die FormatDateDE-Funktion zuschlagen sollte, oder ist das dann schon zu viel Validierung? Dieses Datum ist ja gültig aber nicht erwünscht -> dh schon Fall für die Format-Funktion ?? Die Validierung sagt korrekterweise true. Wo fange ich das am besten ab?
Dieses Datum hingegen ist ungültig . Klarer Fall für die Validierung, die sagt hier auch false
Derzeitige Funkionen
Ausgabe:
So der grundsätziche Plan:
Code:
// Annahme heute ist 03.07.2012 1 -> 01.07.2012 01 -> 01.07.2012 11 -> 11.07.2012 111 -> 11.01.2012 1101 -> 11.01.2012 1.1. -> 01.01.2012 1.12. -> 01.12.2012 110112 -> 11.01.2012
Speziell ob bei zB diesen Werten nicht schon die FormatDateDE-Funktion zuschlagen sollte, oder ist das dann schon zu viel Validierung? Dieses Datum ist ja gültig aber nicht erwünscht -> dh schon Fall für die Format-Funktion ?? Die Validierung sagt korrekterweise true. Wo fange ich das am besten ab?
Code:
Input: 15113 Formated: 15.11.3 bool(true)
Code:
Input: 1122 Formated: 11.22.2012 bool(false)
PHP-Code:
<?php
error_reporting(-1);
date_default_timezone_set('Europe/Berlin');
function formatDateDE($sDate) {
$sDate = trim($sDate);
$dateLen = strlen($sDate);
if ($dateLen < 1 or $dateLen > 10) return false;
// wenn bindestrich enthalten, wert genau so wieder zurückgeben
if (strpos($sDate, "-") !== false) return $sDate;
$curMonth = date("m", $_SERVER['REQUEST_TIME']); // zB 07
$curYear = date("Y", $_SERVER['REQUEST_TIME']); // zB 2012
if (strpos($sDate, ".") !== false) {
$aParts = explode(".", $sDate);
// tag
$day = $aParts[0];
// monat
!empty($aParts[1]) ? $month = $aParts[1] : $month = $curMonth;
// jahr
!empty($aParts[2]) ? $year = $aParts[2] : $year = $curYear;
} else {
// kein Punkt zB 0307 oder 151012
// tag
$day = substr($sDate, 0, 2);
$day = str_pad($day, 2, '0', STR_PAD_LEFT);
// monat
$month = substr($sDate, 2, 2);
if (!$month) $month = $curMonth;
// jahr
$year = substr($sDate, 4);
if (!$year) $year = $curYear;
}
// allgemeine formatierungen noch
$month = str_pad($month, 2, '0', STR_PAD_LEFT);
if (strlen($year) == 2) $year = substr($curYear, 0, 2).$year;
return $day.".".$month.".".$year;
}
function isValidDate($str_date) {
$aDateParts = explode(".", $str_date);
if (count($aDateParts) != 3) return false;
return strtotime($str_date) && checkdate($aDateParts[1], $aDateParts[0], $aDateParts[2]);
}
// ---- Testcase ------------
$aDates = array(
"1", "12", "112", "012", "102", "1111", "1122", "15113", "151113",
"1.12.", "01.12.", "10-11-12"
);
foreach ($aDates as $date) {
echo "Input: ". $date ."\n";
echo "Formated: " . formatDateDE($date). "\n";
var_dump(isValidDate(formatDateDE($date)));
echo "--------------------\n";
}
?>
Code:
Input: 1 Formated: 01.07.2012 bool(true) -------------------- Input: 12 Formated: 12.07.2012 bool(true) -------------------- Input: 112 Formated: 11.02.2012 bool(true) -------------------- Input: 012 Formated: 01.02.2012 bool(true) -------------------- Input: 102 Formated: 10.02.2012 bool(true) -------------------- Input: 1111 Formated: 11.11.2012 bool(true) -------------------- Input: 1122 Formated: 11.22.2012 bool(false) -------------------- Input: 15113 Formated: 15.11.3 bool(true) -------------------- Input: 151113 Formated: 15.11.2013 bool(true) -------------------- Input: 1.12. Formated: 1.12.2012 bool(true) -------------------- Input: 01.12. Formated: 01.12.2012 bool(true) -------------------- Input: 10-11-12 Formated: 10-11-12 bool(false) --------------------
Kommentar