EisFuX: nochmal kürzer mit checkdate()

Beitrag lesen

Ich nochmal ...

  
/// Rückgabe im Fehlerfall: FALSE;  
/// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)  
function date_check(  
  $dmy // dom-month-year, format: DD.MM.YYYY  
) {  
  if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {  
    return FALSE;  
  }  
  
  $year  = intval( $dmy_array[3], 10 );  
  $month = intval( $dmy_array[2], 10 );  
  $dom   = intval( $dmy_array[1], 10 );  
  
  if ( !checkdate($month, $dom, $year) ) {  
    return FALSE;  
  }  
  return array ($dom, $month, $year);  
}  

Das sieht tatsächlich kürzer aus als die umständliche (und korrigierte Variante) Variante von mir:

  
/// Rückgabe im Fehlerfall: FALSE;  
/// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)  
function date_check_input(  
  $dmy // dom-month-year, format: DD-MM-YYYY  
) {  
  // Eingabeformat prüfen  
  if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {  
    return FALSE;  
  }  
  
  // Zeichenketten in Zahlen umwandeln  
  $year  = intval( $dmy_array[3], 10 );  
  $month = intval( $dmy_array[2], 10 );  
  $dom   = intval( $dmy_array[1], 10 );  
  
  // gültiges Jahr?  
  if ($year < 1583) {  
    return FALSE;  
  }  
  
  // gültiger Monat?  
  if ($month < 1 || $month > 12) {  
    return FALSE;  
  }  
  
  // gültiger Tag im Monat? ... etwas komplizierter ;-)  
  if ( in_array( $month, array (4,6,9,11), TRUE ) ) {  
    $days_in_month = 30;  
  }  
  // hier stand vorher fälschlicherweise $dom statt $month  
  elseif(2 === $month) {  
    if (0 != $year % 4)   $days_in_month = 28;  
    if (0 != $year % 100) $days_in_month = 29;  
    if (0 == $year % 400) $days_in_month = 29;  
    else $days_in_month = 28;  
  }  
  else {  
    $days_in_month = 31;  
  }  
  
  if ($dom < 1 || $dom > $days_in_month) {  
    return FALSE;  
  }  
  
  return array ($dom, $month, $year);  
}  

... ist zwar länger (und umständlicher) aber pädagogisch wertvoller. ;-) Und wer es ganz genau nimmt, kann die Funktion so umbauen, dass sie mitteilt, in welchem Teil (Tag, Monat, Jahr) des eingegebenen Datums der Fehler steckte.

MffG
EisFuX