Редактировать: исправлены ошибки в соответствии с комментариями.
Предположим, у вас есть данные о датах начала и окончания, скажем, как в том, что возвращает getdate (), тогда вы можете сгенерировать дату без необходимости идтичерез отметку времени:
$year = rand($start_details['year'], $end_details['year']);
$isleap = $year % 400 == 0 || ($year % 100 != 0 && $year % 4);
$min_yday = $year > $start_details['year'] ? 0 : $start_details['yday'];
$max_yday = $year == $end_details['year'] ? $end_details['yday'] : ($isleap ? 365 : 364);
$yday = rand($min_yday, $max_yday);
$sec_in_day = 24 * 60 * 60;
$date_details = getdate($yday * $sec_in_day + ($isleap ? 2 * 365 * $sec_in_day : 0));
return sprintf('%04d-%02d-%02d', $year, $date_details['mon'], $date_details['mday']);
Что-то в этом роде (я не проверял).Код выше предполагает UTC, вы можете сместить в соответствии с вашим часовым поясом. 5