【问题标题】:Carbon\Carbon giving me issues碳\碳给我的问题
【发布时间】:2018-11-30 12:22:42
【问题描述】:

您好,我正在尝试构建一个应用程序,从今天开始绘制过去 7 天的图表,并且我正在使用 Laravel 5 - Carbon\Carbon 日期包.. 所以如果今天是星期三,它会在星期二结束 如果今天是星期五,它将在下周星期四结束

    $now = Carbon::now();

    $ar = [];
    for($i=1; $i<7; $i++){
        array_push($ar, $now->subDays($i));
    }

    pr($ar, true);

其中 pr() 是一个类似于 dd() 的辅助函数,我用一种简单的方式写了只是死转储,但我得到了这个输出,第一个问题是,记住今天是 - 星期五, 2018年11月30日,2018-11-30

Array(
[0] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[1] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[2] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[3] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[4] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[5] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

它应该持续到 29 日、28 日、27 日,但它可以追溯到 11 月 9 日,甚至没有顺序,比如 09、08、07、06,只是 11 月 09 日,我不知道我是什么弄错了,求帮助,谢谢。

【问题讨论】:

  • 我相信您已经有了答案,但作为旁注,您使用循环计数器 $i 减去您发布的代码中的天数;实际上,这意味着您从日期对象中减去 1 天,然后第二次从同一个日期对象中减去 2 天,然后是 3 天,等等。这就是为什么您最终得到日期 1+2+3+4+ 5+6 = 过去 21 天。

标签: php laravel php-carbon


【解决方案1】:

当您在碳对象上使用函数时,该对象将自我更新并返回对该对象的引用。因此,您的 $ar 数组包含对同一对象的多个引用。每次使用 subDays 时,实际上都是在更新数组中的每个对象。

如果你想用不同的碳对象填充你的数组,你必须每次都创建一个新实例。例如,像这样:

$ar = [];
for($i=1; $i<7; $i++){
    array_push($ar, now()->subDays($i));
}

now() 是 Laravel 中的一个辅助函数,它返回一个新的 Carbon::now() 实例。

【讨论】:

  • 很高兴我能帮上忙。考虑将此标记为您问题的解决方案,以便其他用户也可以找到它。
【解决方案2】:
$day = Carbon::today();

$ar = [];

for($i=1; $i<=7; $i++){
 array_push($ar, $day);
 $day->subDay(1);
}

这里$day-&gt;subDay(1);方法是修改对象值本身减1,而不是返回修改后的值。

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
【解决方案3】:
$ar = [];
for($i=1; $i<7; $i++){
    $now = Carbon::now();
    $ar[] = $now->subDays($i);
}

Carbon 会在您每次调用 subdays 时更新它的实例,因此您需要重新初始化。

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 2014-02-17
    • 2017-11-28
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多