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

PhpLaravelDatePhp Carbon

Php Problem Overview


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?

Php Solutions


Solution 1 - Php

Try this:

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

Solution 2 - Php

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 - Php

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 - Php

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 - Php

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.

Solution 6 - Php

Another solution is using Carbon method subMonthNoOverflow():

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

Found it here when run into 31 day of month issue: https://github.com/briannesbitt/Carbon/issues/627

Solution 7 - Php

This works for me.

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

Use of single $date variable

$date = Carbon::now();

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSiddharthView Question on Stackoverflow
Solution 1 - PhpDeniz B.View Answer on Stackoverflow
Solution 2 - PhpAbu SayemView Answer on Stackoverflow
Solution 3 - PhpsadalsuudView Answer on Stackoverflow
Solution 4 - PhpTamaView Answer on Stackoverflow
Solution 5 - PhpFuzzyJaredView Answer on Stackoverflow
Solution 6 - PhpelenaView Answer on Stackoverflow
Solution 7 - PhpDeepakView Answer on Stackoverflow