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形式にして、コールします。日付の区切り文字【-】が【/】の場合、変換をかけてからコールします。
もっとスマートなやり方がある気がするのですが・・・ 見つかりませんでした。とりあえず動いているようです。
その中の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形式にして、コールします。日付の区切り文字【-】が【/】の場合、変換をかけてからコールします。
もっとスマートなやり方がある気がするのですが・・・ 見つかりませんでした。とりあえず動いているようです。
コメント