【PHP実践|実務向け】PHP開発で日付操作をスマートに!date_create関数の実践的活用術

導入

PHPでの日付操作において、古くからあるdate関数やstrtotime関数に頼り切っていませんか?これらはシンプルですが、複雑な計算やタイムゾーンの管理には限界があります。今回紹介する「date_create」関数は、PHP 5.2から導入されたDateTimeオブジェクトを生成するための手続き型関数です。なぜこれが重要かというと、オブジェクト指向のアプローチで日付を扱うことで、日付の加算・減算、比較、タイムゾーン変換といった操作が劇的に安全かつ直感的になるからです。特に「例外を投げずにfalseを返す」という特性は、バリデーションにおいて非常に有用です。

基礎知識

date_createは、内部的にはDateTimeクラスのコンストラクタを呼び出すラッパー関数です。この関数が生成するDateTimeオブジェクトは、日付そのものだけでなく、タイムゾーン情報や操作メソッド(add, sub, formatなど)を内包しています。従来のdate()関数は文字列を返すだけですが、DateTimeオブジェクトを使うことで、日付の「状態」を保持し、後からその値を自由に変更・演算できるのが大きな強みです。

実装/解決策

実務では、外部から入力された文字列を日付として扱う場面が多くあります。その際、日付が不正であれば処理を中断する必要がありますが、DateTimeのコンストラクタを直接使うと例外が発生し、try-catchでの制御が必要です。一方、date_createは不正な文字列が渡された場合に「false」を返すため、if文による単純なチェックが可能です。この特性を活かし、入力値のバリデーションとオブジェクト化を同時に行うのがスマートな実装です。

サンプルプログラム

以下のコードは、入力値が正しいかを確認し、正しければ3日後の日付を計算して表示する実用的な例です。

  • 入力された日付文字列を検証し、3日後の日付を返す関数
  • /
    function getThreeDaysLater(string $dateString) {
    // date_createでDateTimeオブジェクトを生成
    $date = date_create($dateString);

    // falseが返ってきた場合は不正な日付とみなす
    if ($date === false) {
    return “無効な日付形式です。”;
    }

    // 3日を加算(DateTime::addメソッドとDateIntervalを使用)
    $date->add(new DateInterval(‘P3D’));

    // 指定したフォーマットで返す
    return $date->format(‘Y-m-d H:i:s’);
    }

    // 実行例
    echo getThreeDaysLater(‘2023-12-01’) . PHP_EOL; // 正常系
    echo getThreeDaysLater(‘invalid-date’) . PHP_EOL; // 異常系(false判定)
    ?>

    応用・注意点

    実務で特に注意すべき点は、DateTimeはミュータブル(変更可能)であるということです。一つのオブジェクトを使い回してaddやsubを行うと、元の値が変わってしまいます。もし元の値を保持したい場合は、DateTimeの代わりに「DateTimeImmutable」を使用することを強く推奨します。また、タイムゾーンを指定する際は、第2引数にnew DateTimeZone(‘Asia/Tokyo’)を渡すことで、サーバーの設定に依存しない正確な時間計算が可能になります。これらを意識するだけで、日付バグの温床を大幅に減らすことができます。

    タイトルとURLをコピーしました