1

我需要什么

我想在两个日期时间之间填充日期时间,而没有从数据库中获取的某些日期。

代码

    $begin = new Datetime('2013-07-01 11:00');
    $endDate = new Datetime('2013-07-25 15:00');
    $exceptionDates = array('2013-07-05','2013-07-11');

    $interval = DateInterval::createFromDateString('1 day');
    $period = new DatePeriod($begin, $interval, $endDate, DatePeriod::EXCLUDE_START_DATE);

如何排除$exceptionDatesfrom $period

4

1 回答 1

2

如果您不想事先将句点转换为数组(例如,您有很多),您可以使用 aFilterIterator或 aCallbackFilterIterator来拒绝您不想要的元素,如下所示:

$begin = new Datetime('2013-07-01 11:00');
$endDate = new Datetime('2013-07-25 15:00');

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $endDate, DatePeriod::EXCLUDE_START_DATE);
$period = new CallbackFilterIterator(new IteratorIterator($period), function ($current, $key, $iterator) {
    return !in_array($current->format('Y-m-d'), array('2013-07-05','2013-07-11'));
});

foreach ($period as $d) {
    var_dump($d->format('Y-m-d'));
}

句点本身不是迭代器,因此它用 IteratorIterator 包裹。或者,您可以将句点转换为数组:

$dates = iterator_to_array($period);

并使用array_filter()orarray_diff()来创建过滤日期数组。

于 2013-07-02T16:00:42.550 回答