我需要使用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
错误的结果。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:44)
试试这个:
pm
答案 1 :(得分:30)
试试这个
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();
答案 2 :(得分:8)
这个......日期从00:00开始初始化,日期结束于23:59结束
$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();
答案 3 :(得分:7)
专门回答您的问题,为什么您的$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)。
如前所述,为了确保这种情况永远不会发生,请务必将日期重置为月份的第1天,然后再做其他事情(因为每个月都有第1天)。
$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
答案 4 :(得分:3)
使用方法
时,Carbon内部目前存在错误Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();
对于那些有31天的月份,该错误会导致最后一天返回30。
IE - 如果您在三月份并且执行上述调用,它将返回2017-03-30而不是2017-03-31,如您所料。
当我在日期之间进行操作时,我最终使用了..
Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();
对于那些在31日结束的日子,最终得到了正确的日期dateTimeString。
答案 5 :(得分:0)
另一个解决方案是使用Carbon方法subMonthNoOverflow()
:
$lastDayofPreviousMonth = Carbon::now()->subMonthNoOverflow()->endOfMonth()->toDateString();
遇到每月31天的问题时,在这里找到了它:https://github.com/briannesbitt/Carbon/issues/627