PHP 日期间隔每 x 周选择一周中的几天


PHP DateInterval select days of week every x weeks

我写了一些代码来输入重复发生的事件。 最棘手的部分是用户可以创建一个事件,并让它在一周中的选定日期重复 x 周。

例如,用户可以选择周一,周三,周五,并每3周重复一次。

如果每周都很容易做到 - 我可以做这样的事情:

$start = new DateTime( '2013-10-01' );
$end = new DateTime( '2014-01-01 23:59:59' );
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
    $dayOfWeek = $date->format('l');
    if ($dayOfWeek == 'Monday' || $dayOfWeek == 'Wednesday' || $dayOfWeek == 'Wednesday') {
        // do something
    }
}

对于上面的代码,我将如何修改它以包含每 3 周的周一/周三/周五?有没有更好的方法来实现这一目标,而无需每天循环播放?

我想我可以使用$date->格式('w');这将给我一年中的数字周。 然后我可以有一个计数器并重置它。

作为一种可能的方法,您可以检查 foreach 内部的周是否发生变化。

<?php
$start = new DateTime( '2013-10-01' );
$end = new DateTime( '2014-01-01 23:59:59' );
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
// only trigger every three weeks...
$weekInterval = 3;
// initialize fake week
$fakeWeek = 0;
$currentWeek = $start->format('W');
foreach ($period as $date) {
    if ($date->format('W') !== $currentWeek) {
        $currentWeek = $date->format('W');
        $fakeWeek++;
        print ' WEEK ' . $currentWeek . '<br/>';
    }
    if ($fakeWeek % $weekInterval !== 0) {
        continue;
    }
    $dayOfWeek = $date->format('l');
    if ($dayOfWeek == 'Monday' || $dayOfWeek == 'Wednesday' || $dayOfWeek == 'Friday') {
        print $date->format('Y-m-d H:i:s') . '   ' . $dayOfWeek . '<br/>';
    }
}
我不知道

这是否是你要找的,但最好是遍历所有日期。当你知道第一个星期一/星期三/星期五

例如:

<?php
$interval = 3;
$monday = date('Y-m-d',strtotime('next Monday'));
$wednesday = date('Y-m-d',strtotime('next Wednesday'));
$friday = date('Y-m-d',strtotime('next Friday'));
for($i=0; $i<$interval;++$i){   
    echo $monday."'n";
    echo $wednesday."'n";
    echo $friday."'n";
    $monday =  date('Y-m-d', strtotime($monday . ' +1 Week'));
    $wednesday =  date('Y-m-d', strtotime($wednesday . ' +1 Week'));
    $friday =  date('Y-m-d', strtotime($friday . ' +1 Week'));
}                       

?>

您可以循环执行此操作,而不必遍历所有日期。