ほんの少しだけハマった。
PHPで日付を計算するには、DateTimeクラスを使うのが便利です。
そして、UTCで書かれた日付データを日本時間に直す場合などは、SetTimeZoneメソッドを使います。
そこで、SetTimeZoneメソッドですが、公式のヘルプには次のように書かれています。
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
http://jp2.php.net/manual/en/datetime.settimezone.php より引用
ただ、どうもこれだとうまく動きません。setTimeZoneメソッドを使ってもタイムゾーンが変わらないのです。
いろいろ唸ってみた結果、どうも、setTimeZoneの結果が、戻り値にしか反映されていないっぽい
<?php
$date = new DateTime('2000-01-01');
echo $date->setTimezone(new DateTimeZone('Asia/Tokyo'))->format('Y-m-d H:i:sP') . "\n";
?>
PHP 7.2.1のバグなのか、新しい仕様なのかは不明です。