PHPで日付を入力するプログラムを作った際に、入力された日付が存在するか調べて、適当な日付が入力されるのを防ぎたいですよね。
今回は日付の整合性を調べることができるcheckdate関数がどういったものなのか、使い方も含めてお教えいたします。
似たような関数であるstrptime関数についても、checkdate関数との違いと共にご紹介します。
日付関係に関する関数を調べているなら、ぜひ記事を参考にしてみてください。
目次
PHPのcheckdate関数を使えば日付の整合性を調査できる
PHPにはcheckdata関数という日付の整合性を調べることができる関数が存在しています。
日付を入力するようなプログラムを作った際にこの関数を使えば、入力された日付が存在しているのかを調べて、正しいか間違っているかを返してくれます。
以下ではcheckdata関数を使って、日付の妥当性や年月日を抽出してのチェック方法をご紹介いたします。
checkdate関数を使って日付の妥当性をチェック
まずcheckdata関数の構文は以下のようになっています。
1 2 |
checkdata(月, 日, 年) 戻り値:Trueまたはfalceを返す |
checkdataの()内に年月日を入れれば、その日付が存在しているか調べて、存在していればTrueを無ければfalceを返してくれます。
この際年,月,日を「,」で区切らないといけないことと、順番は月,日,年であることに注意です。
順番が違っていたり、「,」で区切られていないと存在している日付でも、存在しないことになってしまいます。
以下は参考例です。
1 2 3 4 5 6 7 8 |
// 2021年6月30日を調べる if (checkdata(6, 30, 2021)){ // trueなら以下を表示 echo '存在する日付です。'; } else { // falceなら以下を表示 echo '存在しない日付です。'; } |
2021年6月30日が存在していれば「存在する日付です。」、無ければ「存在しない日付です。」と表示されるようになっています。
日付のデータから年月日を抽出してチェック
前項で紹介したのは予めプログラム内で年月日が入力されている場合です。
実際に導入する場合、入力された日付データを一旦ばらして一致する場所に入れていく必要があります。
また日付を入力してもらうと、大体の場合「2021-6-30」や「2021/6/30」のように、「-」や「/」といった記号で区切られていることが多いです。
そこで一旦入力されたデータをlist関数とexprode関数を使って、年月日だけを抽出し、checkdata関数に入れていきます。
以下はlist・exprode・checkdataの3つを使って、入力された日付を調べる参考例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 日付データを入れる変数を用意 $date = '2021-6-30'; // listとexprodeを使って記号「-」を削除し、年月日をそれぞれ用意した変数に入れる list($Y, $m, $d) = explode('-', $date); // checkdata関数で整合性をチェックして結果を表示 if (checkdata($m, $d, $Y) === true"){ // trueなら以下を表示 echo '存在する日付です。'; } else { // falceなら以下を表示 echo '存在しない日付です。'; } |
例文では用意した変数に直接入れていますが、実際には入力された日付データを変数に入れます。
その後explode関数で記号「-」を削除し、区切られている数字をlist関数を使って、年月日それぞれ用意した変数へと入れます。
記号が「/」の場合でやるならexplode関数内の「’-‘」部分を「’/’」に変更すればできます。
あとはcheckdata関数で調べて結果を表示しますが、先程も説明した通り年月日ではなく月日年の順番なので、処理の際に順番も入れ替えておきましょう。
日付の形式を確認するだけならstrptime関数で可能
PHPには日付関係の関数としてcheckdata関数だけでなく、strptime関数という似たような関数が存在しています。
似ている関数ですが、内容・用途がちょっと違っている関数なので注意しましょう。
ここからはcheckdata関数とstrptime関数の違いや、strptime関数の使い方もご紹介します。
checkdate関数とstrptime関数の違い
checkdata関数とstrptime関数はどちらも日付をチェックしてくれる関数です。
ただしstrptime関数はcheckdata関数と違い、日付の形式をチェックできるだけの関数です。
つまり入力されたデータの形式が指定した通りのものになっていれば、存在しない日付でもtrueを返してくれます。
入力された日付の形式が正しいかどうかがわかればいいだけなら、strptime関数だけで十分です。
strptime関数を使って形式が正しいかどうか確認
ではstrptime関数を実際に使って日付の形式が正しいかを調べる方法を紹介します。
strptime関数を使って以下のように記述すれば、日付形式の正否をチェックできます。
1 2 3 4 5 6 7 8 9 10 |
// 日付データを入れる変数を用意 $date = '2021-2-29'; // 日付データが「-」で区切られたデータか確認 if (strptime($date, '%Y-%m-%d')){ // 「-」で区切られたデータなら中身を表示 echo $date; } else { // 「-」で区切られたデータでないなら以下を表示 echo '日付の形式が間違っています。'; } |
上記では入力された日付データが「-」で区切られた日付かどうかだけを確認しています。
2021年は閏年ではないため2月29日は存在しない日付ですが、「-」で区切られた日付データであるため、trueとなり日付の表示がされます。
これを応用して、checkdata関数の前にstrptime関数で日付形式になっているかどうかを調べて、違った形式のものを弾くといった処理ができます。
その後checkdata関数を使って存在する日付かをチェックするといった、より細かく日付をチェックするプログラムを作ることが可能です。
ちなみに年の部分だけを入力する形にして、その年が閏年かどうかを調べる関数もあります。
以下のようにisLeapYer()関数を用いることで、指定された年が閏年しかどうかの判定ができます。
1 2 3 4 5 |
// isLeapYear関数に年を代入 Function isLeapYear($Y){ // 入力された年が存在しているか確認 return checkdate(2, 29, $Y) } |
入力される年部分以外を2月29日に固定しておくことで、その年が閏年かどうかが確認できます。
まとめ
今回は「PHPのcheckdateとは?日付が正しいかどうかチェックしよう」についてご紹介しました。
似たような関数であるstrptime関数との違いも説明しましたので、使い分けができますね。
年部分だけを使って閏年を確認できるisLeapYearを用いたプログラムも、面白いので使ってみてください。
応用して使えばよりスマートにプログラムが書けますので、ぜひ参考にしてみてください。