php 如何在不修改的情况下获取Carbon示例的年初和/或年末?

kupeojn6  于 2023-06-28  发布在  PHP
关注(0)|答案(4)|浏览(82)

在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。这是因为在第三行。
我知道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行输出2017-12-31 23:59:59

r1zk6ea1

r1zk6ea11#

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

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

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

ttisahbt2#

使用copy()
docs
您还可以创建现有Carbon示例的副本()。正如预期的那样,日期、时间和时区值都被复制到新示例中。

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

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

ovfsdjhp3#

您正在替换第3行中$datetime变量的值。有效地:

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

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

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

$startTime = $dateTime;

echo $dateTime->startOfYear();

现在你两个约会都有了。可能有更多的方法来剥猫的皮,但在不了解碳的情况下,这是保持两者的最简单方法。

balp4ylt

balp4ylt4#

延迟响应- Carbon现在支持类的“不可变”版本,其中endofYear()和类似的修饰符返回一个新的示例和修改后的数据,原始对象保持不变。

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

$startOfYear = $date->startOfYear(); // 2017-02-23 00:00:00
$endOfYear   = $date->endOfYear(); // 2017-12-31 23:59:59

更多信息在这里:https://medium.com/@jaketaylor_52917/how-to-use-carbon-2-0s-carbonimmutable-class-in-laravel-5-8-af7e794efbf7

相关问题