PHPでDBから取得したdatetime型のタイムゾーン設定がうまくいかない

データベースのテーブルにdatetime型のカラムがありUTC時刻が入っていて、PHPで取得してAsia/Tokyoで表示しようとしてうまくいかなかったのでそのときの備忘録。

データベースには、UTCで2025/02/01 10:00が入っていて、それを02/01 19:00と表示したい。
最初、下記のようにしていた。

$dbData = データベースのdatetime型カラムのデータ;
$datetime = DateTime::createFromFormat("Y-m-d H:i:s", $dbData);
echo $datetime->format("m/d H:i");

表示されたのは 02/01 10:00 で、Asia/Tokyoの+09:00されていない。
次に、下記を試した。

$dbData = データベースのdatetime型カラムのデータ;
$datetime = DateTime::createFromFormat("Y-m-d H:i:s", $dbData, new DateTimeZone("Asia/Tokyo"));
echo $datetime->format("m/d H:i");

表示されたのはまたまた 02/01 10:00 で、Asia/Tokyoの+09:00されていない。
次に、下記を試した。

$dbData = データベースのdatetime型カラムのデータ;
$datetime = DateTime::createFromFormat("Y-m-d H:i:s", $dbData);
$datetime->setTimezone(new DateTimeZone("Asia/Tokyo"));
echo $datetime->format("m/d H:i");

表示されたのはまたまた 02/01 10:00 で、Asia/Tokyoの+09:00されていない。
次に、下記を試した。

よくみたら、データベースのdatetime型カラムには 2025/02/01 10:00 が保持されていてタイムゾーンは持っていない。
なので、下記のように、いったんUTCでDateTime型としたうえでAsia/TokyoにsetTimezoneした。

$dbData = データベースのdatetime型カラムのデータ;
$datetime = DateTime::createFromFormat("Y-m-d H:i:s", $dbData, new DateTimeZone("UTC"));
$datetime->setTimezone(new DateTimeZone("Asia/Tokyo"));
echo $datetime->format("m/d H:i");

ようやく 02/01 19:00 と期待通りの結果が表示された。

スポンサーリンク