Php Carbon 2日期解析返回不同的结果

Php Carbon 2日期解析返回不同的结果,php,php-carbon,Php,Php Carbon,因此,我从一个像这样的url获得了一个日期,我试图将它解析成一个碳对象,这样下面的代码就可以了 $newDate = Carbon::parse('2020-05-23'); dd($newDate); 返回这个: Carbon\Carbon @1590192000 {#279 ▼ date: 2020-05-23 00:00:00.0 UTC (+00:00) } 什么是正确的,但当我试图得到这个月的第一天和最后一天,它会改变变量 $newDate = Carbon::parse

因此,我从一个像这样的url获得了一个日期,我试图将它解析成一个碳对象,这样下面的代码就可以了

 $newDate = Carbon::parse('2020-05-23');
 dd($newDate);
返回这个:

Carbon\Carbon @1590192000 {#279 ▼
   date: 2020-05-23 00:00:00.0 UTC (+00:00)
}
什么是正确的,但当我试图得到这个月的第一天和最后一天,它会改变变量

$newDate = Carbon::parse($date);
//dd($newDate);
dd($newDate, $newDate->firstOfMonth(), $newDate->endOfMonth());
然后返回这个

Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}
Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}
Carbon\Carbon @1590969599 {#279 ▼
   date: 2020-05-31 23:59:59.999999 UTC (+00:00)
}
所以它将日期改为20202-05-31?并且
->firstOfMonth()
返回与
->endOfMonth
相同的值,我没有正确解析日期


另外,当我将
Carbon::parse('2020-05-23')
更改为
Carbon::now()
时,它工作正常,但日期不同

,因此我发现了问题,我不明白为什么会发生

但是,当只执行
dd($newDate->firstOfMonth())
时,它工作正常并返回第一个日期,但当添加
newDate->endOfMonth()
以使其
dd($newDate->firstOfMonth(),$newDate->endOfMonth())
时,它返回的值是
$newDate->endOfMonth()的两倍?我不知道这是laravel carbon的错误还是php的错误


var\u dump

相同,日期实例是
可变的
这意味着当您执行类似
$newDate->firstOfMonth()
的操作时,它将更改
$newDate

您可以在文档介绍中阅读这一点

所以当你这么做的时候

dd($newDate,$newDate->firstOfMonth(),$newDate->endOfMonth());
在将参数传递给
dd()
之前,它将执行
firstMonth()
,然后执行
endOfMonth()
,并且由于
$newDate
是可变的,所以参数内容将在月末三次

你能做的是

dd($newDate,$newDate->copy()->firstOfMonth(),$newDate->copy()->endOfMonth());

Carbon::Parse
返回一个可变对象。这意味着这些方法将更改您正在使用的对象,而不是返回新对象并保持原始对象不变

当您调用
dd
时,PHP必须首先准备3个参数,以便在对象上调用这两个方法,最后一个方法将日期更改为当月的最后一天

如果希望对象不可变,则必须使用
CarbonImmutable

$newDate = CarbonImmutable::parse($date);
dd($newDate, $newDate->firstOfMonth(), $newDate->endOfMonth());

请参阅此处了解更多信息:

无法复制,但我没有使用
dd()
它甚至在闰年的2月份也能很好地工作?您的代码的功能取决于
$date
中的内容您确定该变量包含什么吗?@riggsfully是正确的。这对我也有好处。在Tinker中尝试一下(
php artisan Tinker
)。此处可以看到输出$date是url中的变量,如果字符串
2020-05-23
父类
DateTime
没有问题,则发送到laravel中的控制器