使用碳增加日期

2022-08-30 15:13:17

我正在尝试为Laravel 4中的预订系统创建一系列不适用日期。我的数据库中有一行测试,start_date为2016-01-24,end_date为2016-01-29。

这是提取行并使用Carbon循环通过日期以递增一天并将其添加到数组中的代码:

$reserved = Reservation::where('property_id', $property->id)->get();

$blackoutDays = [];

foreach($reserved as $r)
{
    $start = new \Carbon\Carbon($r->start_date);
    $end = new \Carbon\Carbon($r->end_date);
    $days = $start->diff($end)->days;

    for($i = 0; $i <= $days; $i++)
    {
        $date = '';
        $date = $start->addDays($i);

        $blackoutDays[] = $date->format('Y-m-j');
    }
}

我试图$blackoutDays得到的是:

["2016-01-24", "2016-01-25", "2016-01-26", "2016-01-27", "2016-01-28", "2016-01-29"]

但我实际得到的是:

["2016-01-24", "2016-01-25", "2016-01-27", "2016-01-30", "2016-02-3", "2016-02-8"]

有谁知道为什么会发生这种情况/如何解决它?有没有更好的方法来做到这一点?


答案 1

您确实会递增 for 循环的每次运行。因此,它在第一次运行中增加了 1,在第二次运行中增加了 2 天,在第三次运行中增加了 3 天,依此类推。$i

因此,您要替换

$date = $start->addDays($i);

$date = $start->addDays(1);

您可能陷入困境的地方是,在每次调用时,日期都是从日期对象添加的,但事实并非如此,因为此对象不是“不可变的”。$start


答案 2

为了获得更干净的结果,您可以使用addDay()方法:

$date = $start->addDay();

但实际上这是完全相同的。addDay() 方法的源代码:

/**
 * Add a day to the instance
 *
 * @param int $value
 *
 * @return static
 */
public function addDay($value = 1)
{
    return $this->addDays($value);
}

推荐