如何使用 Carbon 获取上个月的第一天和最后一天 - Laravel

How to get First and Last Day of Previous Month with Carbon - Laravel

我需要上个月第一天最后一天使用Carbon Library,我试过如下:

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString();

我得到的结果是 $firstDayofPreviousMonth = '2016-04-01'(因为当前月份是 5 日(5 月))和 $lastDayofPreviousMonth = '2016-05-01'

我得到 $firstDayofPreviousMonth 的正确结果,但它给了我 30 天前的结果,而 $lastDayofPreviousMonth.

的结果是错误的

谁能帮我解决这个问题?

试试这个:

$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');

试试这个

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();

更新代码,更准确

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonthsNoOverflow()->toDateString();

$lastDayofPreviousMonth = Carbon::now()->subMonthsNoOverflow()->endOfMonth()->toDateString();

@kenfai 谢谢

Carbon 目前在使用该方法时存在错误

Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();

该错误导致 return 将有 31 天的月份的最后一天设为 30。

IE - 如果你在三月并且你 运行 上面的调用它将 return 2017-03-30 而不是你期望的 2017-03-31。

当我在做日期之间的操作时,我最终使用了..

Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();

对于那些在 31 日结束的日子,这最终得到了正确的日期 dateTimeString。

有了这个...日期开始于 00:00 并且日期结束于 23:59

$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();

具体回答您关于 $lastDayofPreviousMonth.

为什么得到错误结果的问题

让我们在您的示例中分解此语句:

Carbon::now()->endOfMonth()->subMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->endOfMonth() > 2016-05-31
// ->subMonth() > 2016-04-31 // Simply takes 1 away from 5.

这给我们留下了一个无效的日期——没有 4 月 31 日。额外的一天简单地添加到最后一个有效日期 (2016-04-30 + 1),该日期将日期滚动到 5 月 (2016-05-01)。

如前所述,为确保这种情况永远不会发生,请在执行任何其他操作之前将日期重置为该月的第一天(因为每个月都有第一天)。

$lastDayofPreviousMonth = Carbon::now()->startofMonth()->subMonth()->endOfMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->startofMonth() > 2016-05-01 00:00:00
// ->subMonth() > 2016-04-01 00:00:00
// ->endOfMonth() > 2016-04-30 23:59:59

另一个解决方案是使用 Carbon 方法 subMonthNoOverflow():

$lastDayofPreviousMonth = Carbon::now()->subMonthNoOverflow()->endOfMonth()->toDateString();

当 运行 进入每月 31 日时在此处找到它:https://github.com/briannesbitt/Carbon/issues/627

这对我有用。

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateTimeString(); // 2021-08-01 00:00:00
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateTimeString(); // 2021-08-31 23:59:59

使用单个 $date 变量

$date = Carbon::now();

$firstDayofPreviousMonth = $date->startOfMonth()->subMonth()->toDateTimeString(); // 2021-08-01 00:00:00

$lastDayofPreviousMonth = $date->endOfMonth()->toDateTimeString(); // 2021-08-31 23:59:59