如何使用 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
我需要上个月的第一天和最后一天使用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