【问题标题】:Incrementing dates with Carbon使用 Carbon 递增日期
【发布时间】:2016-05-05 01:42:39
【问题描述】:

我正在尝试为 Laravel 4 中的预订系统创建一组中断日期。我的数据库中有一个测试行,开始日期为 2016 年 1 月 24 日,结束日期为 2016 年 1 月 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 "]

有谁知道为什么会发生这种情况/如何解决?有更好的方法吗?

【问题讨论】:

    标签: php laravel-4 php-carbon


    【解决方案1】:

    每次运行 for 循环时都会增加 $i。所以第一次加 1,第二次加 2 天,第三次加 3 天,以此类推。

    因此,你要替换

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

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

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

    【讨论】:

    • 谢谢,完美运行!现在我要躲起来,直到我不再觉得自己像个菜鸟!
    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-02
      • 2018-07-04
      • 1970-01-01
      • 2019-11-06
      • 2018-03-11
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多