PHPコーディング

日時形式チェック

2008年09月04日
PHPで日時のフォーマット形式をチェックする方法をネットで探したら、いくつか見つかりました。

その中の1つをアレンジして、

function chkDateTime($date_time){
 //YYYY-MM-DD HH:mm:ss
 if(isset($date_time) && (trim($date_time) != '')) {
  if(!preg_match('/^(\d\d\d\d)\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/', $date_time, $dates)) {
   return false;
  }
  else{
   if(!mktime($dates[4], $dates[5], $dates[6], $dates[1], $dates[2], $dates[3])) {
    return false;
   }
  }
 }
 return true;
}

という関数を作って、実行してみました。


ところが、不正な日時を入力しても通ってしまいます。調べていくと、【mktime】関数が思った動きをしていません。
ありえない日時を入力しても、修正して値を返してくれています。かしこい・・・


そこで、日付については、【checkdate】関数を使うことにしました。
checkdate($dates[2], $dates[3], $dates[1]);

時刻についても、関数を調べたのですが、適当な関数がないようです。で、泣く泣く(オーバー)自分で作りました。
時間は0以上23以下、分と秒は0以上59以下をチェックします。


合わせると、こんな関数になりました。

function chkDateTime($date_time){
 //YYYY-MM-DD HH:mm:ss
 if(isset($date_time) && (trim($date_time) != '')) {
  if(!preg_match('/^(\d\d\d\d)\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/', $date_time, $dates)) {
   return false;
  }
  else{
   if(!checkdate($dates[2], $dates[3], $dates[1])){
    return false;
   }
  
   if((0 <= $dates[4]) && ($dates[4] <= 23)){
   }
   else{
    return false;
   }
   
   if((0 <= $dates[5]) && ($dates[5] <= 59)){
   }
   else{
    return false;
   }
  
   if((0 <= $dates[6]) && ($dates[6] <= 59)){
   }
   else{
    return false;
   }
  }
 }
 return true;
}


コール側で、YYYY-MM-DD HH:mm:ss形式にして、コールします。日付の区切り文字【-】が【/】の場合、変換をかけてからコールします。


もっとスマートなやり方がある気がするのですが・・・ 見つかりませんでした。とりあえず動いているようです。