如何在不修改过程的情况下获取Carbon实例的开始和结束?

don*_*ona 2 php datetime laravel php-carbon

在PHP中检查这个自解释代码:

现实:

$dateTime = Carbon::createFromDateTime(2017, 2, 23);

echo $dateTime; // 2017-02-23 00:00:00

echo $dateTime->startOfYear(); // 2017-12-31 23:59:59

echo $dateTime; // 2017-12-31 23:59:59
Run Code Online (Sandbox Code Playgroud)

请注意,4号线,价值$dateTime2017-12-31 23:59:59.那是因为在第3行.

但为什么?我知道Carbon的startOfYear()是一个修饰符,但是我们怎么能在不修改自己的情况下获得一年的开始日期

预期:

$dateTime = Carbon::createFromDateTime(2017, 2, 23);

echo $dateTime; // 2017-02-23 00:00:00

echo $dateTime->startOfYear(); // 2017-12-31 23:59:59

echo $dateTime; // 2017-02-23 00:00:00
Run Code Online (Sandbox Code Playgroud)

在上面,注意第4行.实际上,第4行输出2017-12-31 23:59:59.

Sar*_*mar 9

就像@SteD提到的那样,您可以使用复制功能来获取现有实例而不是修改它.

$date = Carbon::createFromDate(2017, 2, 23);

$startOfYear = $date->copy()->startOfYear();
$endOfYear   = $date->copy()->endOfYear();
Run Code Online (Sandbox Code Playgroud)


Ste*_*teD 5

使用copy()

来自文档

您还可以创建现有 Carbon 实例的 copy()。正如预期的那样,日期、时间和时区值全部复制到新实例。

$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1

// $dt was unchanged and still holds the value of Carbon:now()
Run Code Online (Sandbox Code Playgroud)