How to find the last day of the month from date?

PhpDate

Php Problem Overview


How can I get the last day of the month in PHP?

Given:

$a_date = "2009-11-23"

I want 2009-11-30; and given

$a_date = "2009-12-23"

I want 2009-12-31.

Php Solutions


Solution 1 - Php

t returns the number of days in the month of a given date (see the docs for date):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));

Solution 2 - Php

The code using strtotime() will fail after year 2038. (as given in the first answer in this thread) For example try using the following:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

It will give answer as: 1970-01-31

So instead of strtotime, DateTime function should be used. Following code will work without Year 2038 problem:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

Solution 3 - Php

I know this is a little bit late but i think there is a more elegant way of doing this with PHP 5.3+ by using the DateTime class :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Solution 4 - Php

There is also the built in PHP function cal_days_in_month()?

> "This function will return the number of days in the month of year for the specified calendar." http://php.net/manual/en/function.cal-days-in-month.

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30

Solution 5 - Php

This should work:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';

Solution 6 - Php

The most elegant for me is using DateTime

I wonder I do not see DateTime::createFromFormat, one-liner

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

Solution 7 - Php

Try this , if you are using PHP 5.3+,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

For finding next month last date, modify as follows,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

and so on..

Solution 8 - Php

You could create a date for the first of the next month, and then use strtotime("-1 day", $firstOfNextMonth)

Solution 9 - Php

You can find last day of the month several ways. But simply you can do this using PHP strtotime() and date() function.I'd imagine your final code would look something like this:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Live Demo

But If you are using PHP >= 5.2 I strongly suggest you use the new DateTime object. For example like below:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Live Demo

Also, you can solve this using your own function like below:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);

Solution 10 - Php

Your solution is here..

$lastday = date('t',strtotime('today'));

Solution 11 - Php

If you use the Carbon API extension for PHP DateTime, you can get the last day of the month with:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

Solution 12 - Php

Nowadays DateTime does this quite conveniently if you have month and year you can

$date = new DateTime('last day of '.$year.'-'.$month);

From another DateTime object that would be

$date = new DateTime('last day of '.$otherdate->format('Y-m'));

Solution 13 - Php

You can also use it with datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');

Solution 14 - Php

Carbon API extension for PHP DateTime

Carbon::parse("2009-11-23")->lastOfMonth()->day;

or

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

will return

30

Solution 15 - Php

$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

Solution 16 - Php

> If you have a month wise get the last date of the month then,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
	}

$this->getLastDateOfMonth(01); //31

Solution 17 - Php

2 lines code and you are done:

$oDate = new DateTime("2019-11-23");

// now your date object has been updated with last day of month    
$oDate->setDate($oDate->format("Y"),$oDate->format("m"),$oDate->format("t"));

// or to just echo you can skip the above line using this
echo $oDate->format("Y-m-t");

Solution 18 - Php

Using Zend_Date it's pretty easy:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));

Solution 19 - Php

An other way using mktime and not date('t') :

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

So this way it calculates either if it is 31,30 or 29

Solution 20 - Php

I am using strtotime with cal_days_in_month as following:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));

Solution 21 - Php

Here is a complete function:

public function get_number_of_days_in_month($month, $year) {
	// Using first day of the month, it doesn't really matter
	$date = $year."-".$month."-1";
	return date("t", strtotime($date));
}

This would output following:

echo get_number_of_days_in_month(2,2014);

Output: 28

Solution 22 - Php

There are ways to get last day of month.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 

Solution 23 - Php

I am late but there are a handful of easy ways to do this as mentioned:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Using mktime() is my go to for complete control over all aspects of time... I.E.

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Setting the day to 0 and moving your month up 1 will give you the last day of the previous month. 0 and negative numbers have the similar affect in the different arguements. PHP: mktime - Manual

As a few have said strtotime isn't the most solid way to go and little if none are as easily versatile.

Solution 24 - Php

if you want to go back few months you can do something like this as well.

 $list = [
        0, 1, 2, 3
    ];

    $date = new \Datetime();
    $dates = [];
    foreach($list as $item)
    {

        $set = clone $date;
        $set->modify("-$item month ");
       $dates[] = $set->modify("last day of this month");
       
    }
    return $dates;

Solution 25 - Php

I have wrapped it in my date time helper class here https://github.com/normandqq/Date-Time-Helper using $dateLastDay = Model_DTHpr::getLastDayOfTheMonth();

And it is done

Solution 26 - Php

    $startDate = '2011-12-01';
    $endDate = date('Y-m');
    while (true) {
        try {
            $startDateTime = new DateTime($startDate);
            $startDateTime->add(new DateInterval('P1M'));
            $startDate = $startDateTime->format('Y-m-d');
            $endTime = $startDateTime->format('Y-m-t');
            echo $startDate . ' => ' . $endTime . PHP_EOL;
            if ($startDateTime->format('Y-m') == $endDate) {
                break;
            }
        } catch (Exception $exception) {
            var_dump($exception->getMessage());
            break;
        }
    }

After testing many solutions, this works best for me.

Solution 27 - Php

function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134

Solution 28 - Php

I needed the last day of the next month, maybe someone will need it:

echo date("Y-m-t", strtotime("next month")); //is 2020-08-13, return 2020-09-30

Solution 29 - Php

This a much more elegant way to get the end of the month:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 

Solution 30 - Php

You can use "t" in date function to get the number of day in a particular month.

The code will be something like this:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

The code is self-explained. So hope it helps.

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
QuestionMithun SreedharanView Question on Stackoverflow
Solution 1 - PhpDominic RodgerView Answer on Stackoverflow
Solution 2 - PhpMugunthView Answer on Stackoverflow
Solution 3 - PhpHannoun YassirView Answer on Stackoverflow
Solution 4 - PhpMPVView Answer on Stackoverflow
Solution 5 - PhpkaleazyView Answer on Stackoverflow
Solution 6 - Phpjohn SmithView Answer on Stackoverflow
Solution 7 - PhpMohammed SafeerView Answer on Stackoverflow
Solution 8 - Phpnikc.orgView Answer on Stackoverflow
Solution 9 - PhpFaisalView Answer on Stackoverflow
Solution 10 - PhpVineet KadkolView Answer on Stackoverflow
Solution 11 - PhpeaykinView Answer on Stackoverflow
Solution 12 - PhpMaxView Answer on Stackoverflow
Solution 13 - PhpAjouveView Answer on Stackoverflow
Solution 14 - PhpjosefView Answer on Stackoverflow
Solution 15 - PhpkaylaView Answer on Stackoverflow
Solution 16 - PhpKaushik shrimaliView Answer on Stackoverflow
Solution 17 - PhpjustnajmView Answer on Stackoverflow
Solution 18 - PhpmkerstnerView Answer on Stackoverflow
Solution 19 - PhpRobin RumeauView Answer on Stackoverflow
Solution 20 - Phpuser2448808View Answer on Stackoverflow
Solution 21 - PhpFirzeView Answer on Stackoverflow
Solution 22 - PhpvineetView Answer on Stackoverflow
Solution 23 - PhpJSGView Answer on Stackoverflow
Solution 24 - PhpcodedieselView Answer on Stackoverflow
Solution 25 - PhpNormanView Answer on Stackoverflow
Solution 26 - PhpWinn Minn SoeView Answer on Stackoverflow
Solution 27 - PhpKevinView Answer on Stackoverflow
Solution 28 - PhpZPKSoft Paweł KrzyżanowskiView Answer on Stackoverflow
Solution 29 - PhpLouis SterioView Answer on Stackoverflow
Solution 30 - PhpNawaManView Answer on Stackoverflow