【问题标题】:PHP DateInterval select days of week every x weeksPHP DateInterval 每 x 周选择星期几
【发布时间】:2013-10-26 09:44:09
【问题描述】:

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

例如,用户可以选择 Mon,Wed,Fri 并让它每 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->format('w');这会给我一年中的数字星期。然后我可以有一个计数器并重置它。

【问题讨论】:

    标签: php datetime dateinterval recurring-events


    【解决方案1】:

    作为一种可能的方法,您可以检查 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/>';
        }
    }
    

    【讨论】:

    • 正确,我刚刚找到了一个非常相似的解决方案。
    【解决方案2】:

    我不知道这是否是您要找的,但最好是检查所有日期。 当你知道第一个周一/周三/周五

    例如:

    <?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'));
    }                       
    

    ?>

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

    【讨论】:

    • 有趣,不是我想象的那样,而是一种可能的替代解决方案!感谢您的意见!
    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2017-10-24
    • 2015-01-30
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多