PHPで日付チェックを行う方法
前説
どのシステムにおいても、日付チェックは必ず存在する機能でしょう。早速、PHPで日付チェックを行う方法を紹介したいと思います。
日付の形式チェック
PHPで日付チェックを行う方法は主に2つのステップに分けています。
まずは日付の形式チェックです。日付の形式チェックとは「YYYY-MM-DD」や「YYYY/MM/DD」などのフォーマットチェックことことです。
方法はいろいろがありますが、正規表現を使ってチェックしたほうが良いかと思います。
1 2 3 4 5 6 7 8 |
if(!preg_match('/^[1-9]{1}[0-9]{0,3}\/[0-9]{1,2}\/[0-9]{1,2}$/', $date)){ return false; } |
上記のサンプルですが、「YYYY/MM/DD」形式で、「1/0/0」から「9999/99/99」までの値を許します。
ここの0月0日や99月99日が実際存在しないことをすぐに気付いたと思います。これを救うために、次のステップ、日付の存在チェックが必要となります。
日付の存在チェック
日付の存在チェックはPHPの関数:「checkdate」を使って行います。
1 2 3 4 5 6 7 8 9 |
list($y, $m, $d) = explode('/', $date); if(!checkdate($m, $d, $y)){ return false; } |
「checkdate」関数は欧米の日付表記形式なので、日本の「年月日」ではなく、「月日年」という形式なので、注意が必要です。
PHPで日付チェック(Y/m/d)
実際のプロジェクトのPHPで日付チェックを行うソースを提供します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function isYmd($date){ //(必須チェックは別機能で対応する場合、)入力しない場合スルーする if ($date == '') { return true; } if(!preg_match('/^[1-9]{1}[0-9]{0,3}\/[0-9]{1,2}\/[0-9]{1,2}$/', $date)){ return false; } list($y, $m, $d) = explode('/', $date); if(!checkdate($m, $d, $y)){ return false; } return true; } |
PHPで日付チェック(YYYY/mm/dd)
実際のプロジェクトにおいて、「2013/01/02」のような年が4桁、月、日2桁固定の場合も多いため、ここで一緒に提供します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function isYmd($date){ //(必須チェックは別機能で対応する場合、)入力しない場合スルーする if ($date == '') { return true; } //19xx,20xx年が有効、ここは月と日の桁数だけを制御し、存在チェックは次のcheckdate関数で行う if(!preg_match('/^(19|20)[0-9]{2}\/\d{2}\/\d{2}$/', $date)){ return false; } list($y, $m, $d) = explode('/', $date); if(!checkdate($m, $d, $y)){ return false; } return true; } |
PHPで日付チェック(YYYY/mm)
年月のみのチェックは実際のプロジェクトにもあると思います。日の部分がないため、checkdate関数が不要で、年月のみのチェックは正規表現だけで実現できます。
下記のサンプルは19xx,20xx年のみが有効で、実際の仕様に応じて、年の部分を調整しましょう。
1 2 3 4 5 6 7 8 |
function isYm($date){ //19xx,20xx年が有効 return (bool) preg_match('/^(19|20)[0-9]{2}\/(0[1-9]|1[0-2])$/', $date); } |
まとめ
実際の開発工程において、「2013/01/02」全角日付や「0999/12/31」前頭ゼロような数値を日付チェックで通ってしまった不具合がよくあると思いますので、今回は実際のプロジェクトのPHPで日付チェックを行う方法を紹介しました。ご参考までに。
また、2つのステップではなく、特に正規表現不要で、(3,4行で)一発で実現できる日付チェックを行う方法があれば、是非、コメントで教えてください。
次回はPHPで数値チェックを行う方法を紹介します。
それでは、また!
ディスカッション
コメント一覧
まだ、コメントがありません