導入
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日後の日付を計算して表示する実用的な例です。
/
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’)を渡すことで、サーバーの設定に依存しない正確な時間計算が可能になります。これらを意識するだけで、日付バグの温床を大幅に減らすことができます。