我已经制作了一个可以正常使用32位日期的功能(可以接受strtotime),但这不是可扩展的。我需要随机生成人的出生日期,所以我必须使用DateTime(并且只有< = 5.2.13,使其更难)生成它们。
这就是我所拥有的:
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);
}
现在,如何在两个DateTime之间生成一个随机日期?
谢谢!
答案 0 :(得分:1)
编辑:根据评论修复错误。
假设您有关于开始日期和结束日期的详细信息,请说明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