我已经编写了一些用于输入重复活动的代码。最棘手的部分是用户可以创建一个事件,并在一周的选定日期重复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');这将给我一年中的数字周。然后我可以有一个计数器并重置它。
答案 0 :(得分:4)
您可以检查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/>';
}
}
答案 1 :(得分:1)
我不知道这是不是你要找的东西,但它比通过所有日期要好得多。 当你知道第一个周一/周三/周五
例如:
<?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'));
}
&GT?;
您可以循环执行此操作,而不必查看所有日期。