PHP: Как я могу сделать функцию randomDate ($ startDate, $ endDate)? - PullRequest
4 голосов
/ 19 июля 2010

Я сделал функцию, которая прекрасно работает с 32-битными датами (приемлемо для strtotime), но она не масштабируется.мне нужно случайным образом генерировать даты рождения людей, поэтому я должен использовать функции DateTime (и только <= 5.2.13, чтобы сделать это еще сложнее) для их генерации. </p>

вот что у меня было:

public static function randomDate($start_date, $end_date, $format = DateTimeHelper::DATE_FORMAT_SQL_DATE)
{
    if($start_date instanceof DateTime)     $start_date = $start_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS);
    if($end_date instanceof DateTime)       $end_date   = $end_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS);

    // Convert timetamps to millis
    $min = strtotime($start_date);
    $max = strtotime($end_date);

    // Generate random number using above bounds
    $val = rand($min, $max);

    // Convert back to desired date format
    return date($format, $val);
}

Итак, как я могу сгенерировать случайную дату между двумя датами времени?

спасибо!

1 Ответ

1 голос
/ 20 июля 2010

Редактировать: исправлены ошибки в соответствии с комментариями.

Предположим, у вас есть данные о датах начала и окончания, скажем, как в том, что возвращает 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...