如何在不在此过程中修改 Carbon 实例的情况下获取 Carbon 实例的开始和/或年末?

How to get start and or end of year of a Carbon instance without modifying it in the process?

检查 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

请注意,在第 4 行,$dateTime 的值为 2017-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

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

使用copy()

来自docs

You can also create a copy() of an existing Carbon instance. As expected the date, time and timezone values are all copied to the new instance.

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

// $dt was unchanged and still holds the value of Carbon:now()

您正在替换第 3 行中 $datetime 变量的值。实际上:

$a = 1;
echo $a;
$a = 2;
echo $a;

要解决此问题,您需要执行以下操作:

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

$startTime = $dateTime;

echo $dateTime->startOfYear();

现在你会有两个日期。给猫剥皮的方法可能更多,但在不了解碳的情况下,这是最简单的方法。

就像@SteD 提到的,您可以使用复制函数来获取现有实例而不修改它。

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

$startOfYear = $date->copy()->startOfYear();
$endOfYear   = $date->copy()->endOfYear();

延迟响应 - Carbon 现在支持其 class 的“不可变”版本,其中 endofYear() 和类似修饰符 return 具有修改数据的新实例,以及原始对象保持不变。