如何在不在此过程中修改 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 具有修改数据的新实例,以及原始对象保持不变。
检查 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 具有修改数据的新实例,以及原始对象保持不变。