如何修改PHP代码生成不含周日的指定范围及时段双随机日期?
生成非周日的递进随机日期
需求说明
- 第一个随机日期需落在时间戳
$startDate与$endDate之间 - 第二个随机日期需落在第一个生成日期与
$endDate之间 - 两个日期的小时部分必须处于
$startHour与$endHour范围内 - 额外要求:两个日期都不能是周日
原实现代码
$createDate = new DateTime(); $updateDate = new DateTime(); $createDate ->setTimestamp(rand($startDate, $endDate)) ->setTime(rand($startHour, $endHour), rand(0, 59), rand(0, 59)); $updateDate ->setTimestamp(rand($createDate->getTimestamp(), $endDate)) ->setTime(rand($startHour, $endHour), rand(0, 59), rand(0, 59));
修改后的代码(满足非周日要求)
$createDate = new DateTime(); $updateDate = new DateTime(); // 生成符合条件的创建日期:非周日、时间范围正确、小时区间合规 do { $createDate->setTimestamp(rand($startDate, $endDate)) ->setTime(rand($startHour, $endHour), rand(0, 59), rand(0, 59)); } while ($createDate->format('w') === '0'); // 0代表周日,不符合就重新生成 // 生成符合条件的更新日期:非周日、在创建日期之后、小时区间合规 do { $updateDate->setTimestamp(rand($createDate->getTimestamp(), $endDate)) ->setTime(rand($startHour, $endHour), rand(0, 59), rand(0, 59)); } while ($updateDate->format('w') === '0');
关键说明
- 用
do-while循环做校验:先生成日期,再检查是否为周日,是就重新生成,直到得到符合要求的日期 DateTime::format('w')返回值范围是0(周日)到6(周六),判断是否等于'0'就能排除周日- 每次循环都会重新生成完整的时间戳和时分秒,保证随机性的同时满足所有约束条件
内容的提问来源于stack exchange,提问作者trejder
相关产品推荐
相关产品推荐

