下記のようなコードで検証。
<?php
$zero = new DateTime('0000-01-01', new DateTimeZone('utc'));
$zero->setTimezone(new DateTimeZone('Asia/Tokyo'));
var_dump($zero->format('Y-m-d H:i:s')); // string(19) "0000-01-01 09:18:59"
$y1887 = new DateTime('1887-01-01', new DateTimeZone('utc'));
$y1887->setTimezone(new DateTimeZone('Asia/Tokyo'));
var_dump($y1887->format('Y-m-d H:i:s')); // string(19) "1887-01-01 09:18:59"
$y1888 = new DateTime('1888-01-01', new DateTimeZone('utc'));
$y1888->setTimezone(new DateTimeZone('Asia/Tokyo'));
var_dump($y1888->format('Y-m-d H:i:s')); // string(19) "1888-01-01 09:00:00"
$y2000 = new DateTime('2000-01-01', new DateTimeZone('utc'));
$y2000->setTimezone(new DateTimeZone('Asia/Tokyo'));
var_dump($y2000->format('Y-m-d H:i:s')); // string(19) "2000-01-01 09:00:00"
なんで 1887年以前だと"9:15:59"なん?ってのは 18分59秒をめぐって日本標準時の歴史をひもとくことに - エムスリーテックブログ に詳しく書かれてます。
PHP7.2までだと発生しなかったようなので、PHP7.3になってから、いつの時差なのかを考慮するようになったのかなと思います。