用 Carbon 增加日期
Incrementing dates with Carbon
我正在尝试为 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"]
有谁知道为什么会这样/如何解决?有更好的方法吗?
您在 for 循环的每个 运行 中递增 $i
。所以它在第一个 运行 中添加 1,在第二个中添加 2 天,在第三个中添加 3 天,依此类推。
因此,您要替换
$date = $start->addDays($i);
和
$date = $start->addDays(1);
你可能掉坑的地方是每次调用时从 $start
日期对象添加天数的想法,但事实并非如此,因为这个对象不是“Immutable".
要获得更清晰的结果,您可以使用 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);
}
我正在尝试为 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"]
有谁知道为什么会这样/如何解决?有更好的方法吗?
您在 for 循环的每个 运行 中递增 $i
。所以它在第一个 运行 中添加 1,在第二个中添加 2 天,在第三个中添加 3 天,依此类推。
因此,您要替换
$date = $start->addDays($i);
和
$date = $start->addDays(1);
你可能掉坑的地方是每次调用时从 $start
日期对象添加天数的想法,但事实并非如此,因为这个对象不是“Immutable".
要获得更清晰的结果,您可以使用 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);
}