How to get First and Last Day of Previous Month with Carbon - Laravel
Solution 1
Try this:
$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');
Solution 2
Just try this
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();
Updated code, which is more accurate
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonthsNoOverflow()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->subMonthsNoOverflow()->endOfMonth()->toDateString();
@kenfai Thanks
Solution 3
With this ... the date start init on 00:00 and date end finish in 23:59
$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();
Solution 4
To specifically answer your question as to why you're getting the wrong result for $lastDayofPreviousMonth
.
Lets break down this statement in your example:
Carbon::now()->endOfMonth()->subMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->endOfMonth() > 2016-05-31
// ->subMonth() > 2016-04-31 // Simply takes 1 away from 5.
This leaves us with an invalid date — there is no 31st of April. The extra day is simply added on to the last valid date (2016-04-30 + 1) which rolls the date into May (2016-05-01).
As previously mentioned to be sure this never happens always reset the date to the 1st of the month before doing anything else (as every month has a 1st day).
$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
Solution 5
There is currently a bug within Carbon when using the method
Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();
The bug results in returning the last day as 30 for those months that have 31 days.
IE - if you are in March and you run the above call it will return 2017-03-30 and not 2017-03-31 as you would expect.
As I was doing a between dates operation I ended up using..
Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();
This ended up with the correct date dateTimeString for those days that end on the 31st.
Comments
-
Siddharth almost 2 years
I need First and Last Day of Previous Month using Carbon Library, what I have tried is as follows:
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString(); $lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString();
Result I'm getting is for
$firstDayofPreviousMonth = '2016-04-01'
(as current month is 5th(May)) and for$lastDayofPreviousMonth = '2016-05-01'
.I'm getting correct result for
$firstDayofPreviousMonth
, but it's giving me 30 days previous result, and giving me wrong result for$lastDayofPreviousMonth
.Can anyone help me out with this?