我试图在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的是:
[&#34; 2016-01-24&#34;,&#34; 2016-01-25&#34;,&#34; 2016-01-26&#34;,&#34; 2016-01 -27&#34;,&#34; 2016-01-28&#34;,&#34; 2016-01-29&#34;]
但我真正得到的是:
[&#34; 2016-01-24&#34;,&#34; 2016-01-25&#34;,&#34; 2016-01-27&#34;,&#34; 2016-01 -30&#34;,&#34; 2016-02-3&#34;,&#34; 2016-02-8&#34;]
有谁知道为什么会发生这种情况/如何解决?有没有更好的方法呢?
答案 0 :(得分:17)
每次运行for循环都会增加$i
。因此,它在第一次运行中增加1,在第二次运行中增加2天,在第三次运行中增加3天,依此类推。
因此,您想要替换
$date = $start->addDays($i);
与
$date = $start->addDays(1);
你可能陷入困境的地方是在每次调用时从$start
日期对象添加日期的想法,但事实并非如此,因为这个对象不是&#34; {{3 }}&#34;
答案 1 :(得分: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);
}