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.
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.
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));
DateTime
you can do something like this: (new DateTime('2009-11-23'))->modify('last day of')
–
Darelldarelle echo date("Y-m-t", strtotime(date('2019-02-29')));
, it should be output 28
. but showing 03-31
–
Demetrademetre 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');
$date = new DateTime('last day of 2020-2');
–
Capias $date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
–
Dominations now
to date anything you want –
Firepower If you're using a 32-bit system, then the strtotime() code will fail after the year 2038 due to the Year 2038 problem.
For example, on a 32-bit system, this code will echo 1970-01-31
:
$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));
If you need your code to support 32-bit systems, then you should instead use the DateTime function:
$d = new DateTime('2040-11-23');
echo $d->format('Y-m-t');
That code will correctly output 2040-11-30
on both a 32-bit or 64-bit system.
strtotime
code gives me this result: 2040-11-30 –
Eyeglasses 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 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/>';
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");
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..
$date = new DateTime('last day of 2022-06');
. –
Styrene You could create a date for the first of the next month, and then use strtotime("-1 day", $firstOfNextMonth)
mktime(0, 0, 0, $month+1, 0, $year);
–
Remarkable 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 ... –
Nicolas 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));
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');
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);
Your solution is here..
$lastday = date('t',strtotime('today'));
31
for September
which as you know that's not correct. –
Peshitta 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'));
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
$date->day = 0;
–
Juba Carbon API extension for PHP DateTime
Carbon::parse("2009-11-23")->lastOfMonth()->day;
or
Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;
will return
30
You can also use it with datetime
$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');
$date1 = $year.'-'.$month;
$d = date_create_from_format('Y-m',$date1);
$last_day = date_format($d, 't');
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
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");
Using Zend_Date it's pretty easy:
$date->setDay($date->get(Zend_Date::MONTH_DAYS));
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
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'));
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
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]);
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.
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;
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
$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.
Here's a one liner that may be of interest.'Y-m-j' is the date format for the output and the second string is the date of interest with an offset string:
echo date('Y-m-j', strtotime('2009-12-23 last day of this month'));
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); }
}
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
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))));
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.
© 2022 - 2024 — McMap. All rights reserved.