PHPで正しい日付チェック

こんにちは、さるまりんです。

プログラムを書くとき入力値の有効性チェックをします。今回はPHPでの日付チェックについてです。

strptime()で形式チェック

日付文字列はyyyy/mm/ddyyyy-mm-ddの形式の文字列で表現されることが多いです。

文字列が正しい日付の形式になっているかをチェックするにはstrptime()関数を使います。

$date_str = '2020-01-20'; // チェックする文字列
$format_str = '%Y-%m-%d'; // ハイフン区切りの年月日の形式
$is_date_str = strptime($date_str, $format_str);

これで$is_date_strfalseでなければ形式チェックはOKです。

strptime()は文字列を形式に基づいてパースする関数です。正しい文字列の場合はパースされた結果の配列を返します。パースできなかったときにはfalseを返すのでfalseの時は正しい形式ではないということです。

ただし、strptime()では形式はチェックできますが、有効な日付かどうかのチェックはできません。

例えば2020-02-30

今年の2月はうるう年なので29日までありますが、30日はありません。

$date_str = '2020-02-30';
$format_str = '%Y-%m-%d';
if (strptime($date_str, $format_str)) {
    echo "OK";
} else {
    echo "NG";
}

が、このプログラムはOKを表示してします。

checkdate()で有効日チェック

日付が有効かをチェックするにはcheckdate()関数を使います。

呼び出し方はcheckdate(月, 日, 年)です。

2020-02-30checkdate()でチェックするとfalseを返してくれます。

if (checkdate(2, 30, 2020)) {
    echo "OK";
} else {
    echo "NG";
}

上記を実行するとNGが表示されます。

日付がyyyy-mm-ddの文字列であった時は、explode()で分割することでcheckdate()を呼び出す準備ができます。

$date_str = '2020-02-30';
list($year, $month, $day) = explode("-", $date_str);
if (checkdate($month, $day, $year)) {
    echo "OK";
} else {
    echo "NG";
}

用意されている関数での簡単にチェックできるの便利ですね。

読んでくださってありがとうございます。

それではまた!