3

除了星期天,我需要得到接下来的 7 个(或更多)日期。首先我喜欢

$end_date = new DateTime();
$end_date->add(new DateInterval('P7D'));

$period = new DatePeriod(
    new DateTime(),
    new DateInterval('P1D'),
    $end_date
);

并在入住$periodforeach。但后来我注意到,如果我删除星期天,我需要在最后再加一天,这是每次星期天的时候......有什么办法吗?

4

4 回答 4

4
$start = new DateTime('');
$end = new DateTime('+7 days');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    if ($dt->format("N") === 7) {
        $end->add(new DateInterval('P1D'));
    }
    else  {
        echo $dt->format("l Y-m-d") . PHP_EOL;
    }
}

看到它在行动

于 2013-05-18T12:23:22.410 回答
1

我喜欢使用迭代器,以使实际循环尽可能简单。

$days_wanted = 7;

$base_period = new DatePeriod(
    new DateTime(),
    new DateInterval('P1D'),
    ceil($days_wanted * (8 / 7)) // Enough recurrences to exclude Sundays
);

// PHP >= 5.4.0 (lower versions can have their own FilterIterator here)
$no_sundays = new CallbackFilterIterator(
    new IteratorIterator($base_period),
    function ($date) {
        return $date->format('D') !== 'Sun';
    }
);

$period_without_sundays = new LimitIterator($no_sundays, 0, $days_wanted);

foreach ($period_without_sundays as $day) {
    echo $day->format('D Y-m-d') . PHP_EOL;
}
于 2013-05-18T12:43:02.073 回答
0

您可以尝试使用 UNIX 时间,添加日期,如果日期是星期日,则添加另一个。您列表的第一天将是例如。今天中午 12:00。比你加 24 * 60 * 60 得到第二天,以此类推。将 UNIX 转换为日期很简单,使用date()函数。

$actDay = time();
$daysCount = 0;
while(true)
{
   if (date("D", $actDay) != "Sun") 
   {
     //do something with day
     $daysCount++;
   }

   if ($daysCount >= LIMIT) break;

   $actDay += 24 * 60 * 60;
}
于 2013-05-18T12:23:15.883 回答
0

您不能从 a 中删除天数DatePeriod,但您可以简单地保留非星期天的计数并继续迭代,直到您积累了 7 个:

$date = new DateTime();

for ($days = 0; $days < 7; $date->modify('+1 day')) {
    if ($date->format('w') == 0) {
        // it's a Sunday, skip it
        continue;
    }

    ++$days;
    echo $date->format('Y-m-d')."\n";
}
于 2013-05-18T12:25:46.007 回答