ChatGPT解决这个技术问题 Extra ChatGPT

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

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.


S
SilentGhost

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));

This will fail after year 2038. So instead of strtotime, DateTime function should be used. Following code will work without Year 2038 problem: $d = new DateTime( '2009-11-23' ); echo $d->format( 'Y-m-t' );
@Mugunth If you are working with dates 24 years in the future you may run into problems sooner than 2038, however, servers are already moving over to 64-bit architecture which will give us about 292 billion years to correct the problem.
in procedural -> $date1 = $year.'-'.$month; $d = date_create_from_format('Y-m',$date1); $last_day = date_format($d, 't');
With DateTime you can do something like this: (new DateTime('2009-11-23'))->modify('last day of')
@victor you should bump your comment as answer for the sole reason that it results in readable and understandable code. Clearly using Y-m-t would work as well but who without looking at the docs would know what "t" is?
M
Mugunth

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' );

I will be 71 and retired by then, so not a problem for me! j/k But seriously folks -- heed this warning!
This assumes you are running a 32-bit version of PHP.
why is this alarming fact about strtotime not mentioned in the php docu php.net/manual/de/function.strtotime.php ?
@Adam It is now, not sure if it was when you checked. php.net/manual/de/…
As of 2018, the strtotime code gives me this result: 2040-11-30
H
Hannoun Yassir

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');

In one line: $date = new DateTime('last day of this month');
You might want to add $date->modify('last day of this month')->setTime(23,59,59); if you would like to use this dateTime for comparison where time matters. (This gives you the last second of the month)
This works: $date = new DateTime('last day of 2020-2');
@John you are wrong. the last day is calculated using the $date object and not the system date. Try it by changing the first line with this : $date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
If you were to think or at least try what I asked you to do you would see that this month means the value of the month in the DateTime object not the system's date. If you can't type/run php code this might help : sandbox.onlinephpfunctions.com/code/…
M
MPV

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

This answer is much simpler and appropriate than the use of strtoTime. I don't see any downsides. To the top you go.
k
kaleazy

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/>';

j
john Smith

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");

I agree. This solution (DateTime class) is much better than using the old datetime functions.
M
Mohammed Safeer

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


This is the correct answer. Just to complement your answer, you can also use it like this $date = new DateTime('last day of 2022-06');.
n
nikc.org

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


an alternative method using the same approach is to give mktime the 0th day of the next month mktime(0, 0, 0, $month+1, 0, $year);
As to me, usage of strtotime() and mktime() is discouraged bec. of known bugs like date determination on the edge of the months and leap year calaculations. Since DateTime is available, you should use this class to avoid any problems in future. Like said many times before me, both these function strtotime() and mktime() will fail after 2038. That's why I downvoted ...
@PaulT.Rawkeen This answer is more than 4 years old. As with anything on the internet, age should be a factor when gauging relevance and usefulness. Further more, IMHO, the halving time for anything related to technology is particularly short.
@nikc.org I agree, especially regarding time of life for all technical solutions and ways of solving problems. In this particular case, answer has relatively good number of upvotes and probably, someone (junior programmer) will consider this answer as acceptable solution bec. it is short and elegant :) and he will probably get the expected result, but as time goes by, this way of solving such kind of problems becomes tricky and we should warn about such facts when its possible. Kind regards.
F
Faisal

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);

FYI, the live demo links do not work anymore.
b
bensiu

Your solution is here..

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

this gives 31 for September which as you know that's not correct.
M
Max

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'));

e
eaykin

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 

Actually, if you set day to -1 it will get the last but one. So you must set day to 0 in order to get the last day. $date->day = 0;
thank you @GiovanneAfonso that is correct. I set the day to 0 and tested the answer.
If you are using Carbon, a one-liner approach is to use: Carbon::Now()->endOfMonth(). However, endOfMonth() is a modifier, so use "clone" if you have an existing variable holding a Carbon date (or the date will be modified).
A
Ajouve

You can also use it with datetime

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

C
Christian Lescuyer

Carbon API extension for PHP DateTime

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

or

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

will return

30

Thanks for suggesting Carbon library.
k
kayla
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

K
Kaushik shrimali

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

j
justnajm

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");

m
mkerstner

Using Zend_Date it's pretty easy:

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

R
Robin Rumeau

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


u
user2448808

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'));

F
Firze

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


v
vineet

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]); 

J
JSG

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.


c
codediesel

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;

N
Norman

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


W
Winn Minn Soe
    $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.


k
kaiser
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


Z
ZPKSoft Paweł Krzyżanowski

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

L
Louis Sterio

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)))); 

S
SilentGhost

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.