首页 > 解决方案 > 避免按天添加日期循环?

问题描述

我正在使用 Carbon 来增加天数,有没有办法避免使用for和/或while循环?

添加天数 ( $skipDayBy) 并添加天数(如果在$excludeDatesPublic或中找到$excludeDatesManual

例如工作演示:

function calculateDate($skipDayBy = 0) {
    $excludeDatesPublic = ['2019-08-28'];
    $excludeDatesManual = ['2019-09-01'];
    $date = Carbon::now();

    for($i = 0; $i < $skipDayBy; $i++) {
        $date = $date->addDays(1);

        while(in_array($date->toDateString(), $excludeDatesPublic) || in_array($date->toDateString(), $excludeDatesManual))
        {
            $date = $date->addDays(1);
        }
    }

    return $date->toDateString();
}

echo calculateDate(4);

如果今天的日期是 2019-08-27,则按预期返回 2019-09-02。

标签: phpphp-carbon

解决方案


也许您正在寻找https://github.com/kylekatarnls/business-day,它允许您添加跳过假期的天数。

或者,您可以使用句点:

$skipDayBy = 5;
$excludeDatesPublic = ['2019-09-01'];
$excludeDatesManual = ['2019-09-04'];
$exclude = array_merge($excludeDatesPublic, $excludeDatesManual);

$date = CarbonPeriod::create(Carbon::now(), $skipDayBy)
    ->addFilter(function (Carbon $date) use ($exclude) {
        return !in_array($date->format('Y-m-d'), $exclude);
    })
    ->calculateEnd();

var_dump($date); // 2019-09-06 18:50:17 if run at 2019-08-31 18:50:17

推荐阅读