PHP の DataTime でタイムゾーンを変換する

PHP でタイムゾーンの変換は頻繁に必要になりますよね。

最初に渡す時刻の文字列にタイムゾーンが含まれている場合

2022-09-21T23:48:28.341Z のように API のレスポンスでよくある書式です。

この場合は最後に Z が付いているので、この時刻は UTC の時刻であることが分かります。

その場合は下記のように変換します。

// 最初に渡す時刻の文字列にタイムゾーンが含まれている場合
$date = new DateTime('2022-09-21T23:48:28.341Z');
$date->setTimeZone(new DateTimeZone('Asia/Tokyo'));
echo $date->format('c');

// 出力結果
2022-09-22T08:48:28+09:00

最初に渡す時刻の文字列にタイムゾーンが含まれていない場合

次は API のレスポンスではあまりないケースですが、2022-09-21 23:48:28 のように時間の表記にタイムゾーンが含まれていない場合です。例えば別システムからデータをインポートするときなどはありそうなケースですね。

この場合は、下記のようにして最初に DateTime のインスタンスを作成するところでタイムゾーンを指定してあげましょう。

// 最初に渡す時刻の文字列にタイムゾーンが含まれていない場合
$date = new DateTime('2022-09-21 23:48:28', new DateTimeZone('UTC'));
$date->setTimeZone(new DateTimeZone('Asia/Tokyo'));
echo $date->format('c');

// 出力結果
2022-09-22T08:48:28+09:00

PHP で時刻周りで困ったら公式のマニュアルを見れば大抵解決しますね。