这是一个Laravel项目,我试图在下面两个日期之间随机收集日期。选择的随机日期需要相隔6年,并且在周一,周四或周日。我有下面的日期功能,适用于我需要的另一个日期范围,但是在这种情况下还有6年的额外因素,所以我需要对它进行额外修改而不确定我需要做些什么来解释它这种情况。
$start = Carbon::parse('First Monday of January 2000');
$nextMonth = Carbon::now()->addMonth();
collect([
'monday' => false,
'thursday' => false,
'sunday' => true
])->flatMap(function ($bool, $day) use ($start, $nextMonth) {
return dates($start, $nextMonth, $day, $bool);
})->sort(function ($a, $b) {
return strtotime($a) - strtotime($b);
})->values()->map(function ($date, $key) {
return factory(Event::class)->create([
'name' => 'Event ' . ($key + 1),
'date' => $date
]);
})->filter(function ($event) {
return $event->date->lt(Carbon::today());
function dates(Carbon $from, Carbon $to, $day, $last = false)
{
$step = $from->copy()->startOfMonth();
$modification = sprintf($last ? 'last %s of next month' : 'next %s', $day);
$dates = [];
while ($step->modify($modification)->lte($to)) {
if ($step->lt($from)) {
continue;
}
$dates[$step->timestamp] = $step->copy();
}
return $dates;
}
答案 0 :(得分:2)
如果第二个日期 完全 从第一个随机日期起六年:
$second_date = $first_date->diffInYears($first_date->copy()->addYears(6))
来自Carbon文档:http://carbon.nesbot.com/docs/#api-difference
<强>更新强>
这是一种根据开始日期创建日期数组的方法,其中每个日期至少相隔六年,周一,周四或周日。
我已经在20次迭代中离开了循环,因此您可以看到多年来生成的日期不同。
$start = Carbon::parse('First Monday of January 2000');
$dates = array();
for ($i = 1; $i < 20; $i ++)
{
$interval = $i * 6;
if ($start->copy()->addYears($interval)->dayOfWeek === Carbon::MONDAY OR $start->copy()->addYears($interval)->dayOfWeek === Carbon::THURSDAY OR $start->copy()->addYears($interval)->dayOfWeek === Carbon::SUNDAY)
{
$dates[] = $start->copy()->addYears($interval);
} else
{
$dates[] = $start->copy()->addYears($interval)->modify('next monday');
}
}