PHP:如何生成randomDate($startDate,$endDate)函数?

PHP:如何生成randomDate($startDate,$endDate)函数?,php,datetime,random,Php,Datetime,Random,我制作了一个函数,它可以很好地处理32位日期(strotime可以接受),但它不可伸缩。我需要随机生成人们的出生日期,所以我必须使用DateTime(并且仅编辑:根据评论修复错误) 假设您有开始日期和结束日期的详细信息,比如getdate()返回的内容,那么您可以生成一个日期,而不必经过时间戳: $year = rand($start_details['year'], $end_details['year']); $isleap = $year % 400 == 0 || ($year % 1

我制作了一个函数,它可以很好地处理32位日期(strotime可以接受),但它不可伸缩。我需要随机生成人们的出生日期,所以我必须使用DateTime(并且仅编辑:根据评论修复错误)

假设您有开始日期和结束日期的详细信息,比如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

为什么它不可伸缩?您是否试图在遥远的将来随机生成日期?(2038年过去)@Byron-或1970年之前(他说他在做生日)为什么不在2010年取一个随机日期,并添加一个随机的年份数。Presto.不考虑闰年,但这可能不是一个大问题。@Eric-因为PHP 5.1负时间戳已经得到支持,所以使用标准日期/时间函数的最早日期是1901年12月13日。但可能是真正的老年人的出生日期,这是一个非常重要的问题问题?!您需要将DateTime类用于此范围之外的日期(内部将日期存储为64位),但必须避免使用整数和标准日期/时间函数,如
date()
。如果限制为$max_yday=$year==$end_details['year']?$end_details['yday']:($isleap?366:365);-这不应该是
($isleap?365:364)
?yday在0..365的范围内,365是闰年(一年中的第365天)的最大天数,从0(第一天)开始。(?)另外:
$date\u details=getdate($yday*$sec\u in_day+($isleap?0:$sec\u in_leapyear));
-这不意味着1970年(unix时间戳中的第0年)是闰年吗?事实并非如此。如果
$isleap
,那么你不需要加上2年(正常)年到1972年(第一个闰年),否则什么也不加吗?啊,是的,你说得对。max day应该是一个零基索引,因为它会在之后转换为秒(第一天从0秒开始)你说得对。1970年不是闰年,我错了,不知怎的,我想那是闰年。
$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']);