Ваша проблема на самом деле довольно проста для выявления.Вы используете один и тот же экземпляр, хранящийся в $start_date
, в нескольких местах, что означает, что любое изменение этого экземпляра будет отражено во всех местах, потому что:
В PHP объекты передаютсяссылка
Это означает, что если вы создаете экземпляр DateTime
, хранящийся в $start_date
, а затем вызываете $start_date->modify()
, это изменит значение и будет отражено во всех местах вна которую ссылается переменная.
Таким образом, вы по существу передаете те же два измененных значения $start_date
, чтобы сгенерировать значение $end_date
, поэтому вы получаете одинаковую дату для обоих краев диапазона.
Чтобы решить проблему с ссылками, вам нужно создать клон вашего $start_date
и вызвать modify
для этого, чтобы избежать изменения исходного значения:
$start_date = $faker->dateTimeBetween('+0 days', '+1 month');
$start_date_clone = clone $start_date;
$end_date = $faker->dateTimeBetween($start_date, $start_date_clone->modify('+5 hours'));
Для смягчения проблем со ссылками в PHP 5.5 введено DateTimeImmutable
, которое не применяет изменения к себе.Однако реализация Faker dateTimeBetween
специально проверяет, являются ли экземпляры, переданные методу, объектом DateTime
(или просто обычными строками даты и времени, которые он может передать strtotime()
), поэтому он не работает с DateTimeImmutable
.