Как найти последний день месяца с даты?

382

Как я могу получить последний день месяца в PHP?

Данный:

$a_date = "2009-11-23"

Хочу 2009-11-30; и дано

$a_date = "2009-12-23"

Я хочу 2009-12-31.

Митхун Шридхаран
источник

Ответы:

805

tвозвращает количество дней в месяце данной даты (см. документациюdate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));
Доминик Роджер
источник
99
Это не удастся после 2038 года. Поэтому вместо strtotime следует использовать функцию DateTime. Следующий код будет работать без проблем 2038 года: $ d = new DateTime ('2009-11-23'); echo $ d-> format ('Ymt');
Mugunth
74
@Mugunth Если вы работаете с датами через 24 года, у вас могут возникнуть проблемы раньше, чем к 2038 году, однако серверы уже переходят на 64-битную архитектуру, что даст нам около 292 миллиардов лет на решение проблемы.
Нет
1
в процедурном -> $ date1 = $ year .'- '. $ month; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
Кайла
11
С DateTimeвами можно сделать что-то вроде этого:(new DateTime('2009-11-23'))->modify('last day of')
Виктор
Если вы используете Carbon PHP, вы можете использовать daysInMonth getter
astroanu
119

Код, использующий strtotime (), потерпит неудачу после 2038 года (как указано в первом ответе в этой теме). Например, попробуйте использовать следующее:

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

Это даст ответ как: 1970-01-31

Поэтому вместо strtotime следует использовать функцию DateTime. Следующий код будет работать без проблем 2038 года:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );
Mugunth
источник
17
Мне будет 71 год, и я уйду на пенсию, так что для меня это не проблема! j / k А если серьезно, ребята - учтите это предупреждение!
Volomike
17
Это предполагает, что вы используете 32-битную версию PHP.
Нет
почему этот тревожный факт о strtotime не упоминается в документе php php.net/manual/de/function.strtotime.php ?
Адам
1
@ Адам Это сейчас, не уверен, если это было, когда вы проверили. php.net/manual/de/…
Mave
1
По состоянию на 2018 год strtotimeкод дает мне такой результат: 2040-11-30
Джи
104

Я знаю, что это немного поздно, но я думаю, что есть более элегантный способ сделать это с PHP 5.3+помощью класса DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');
Ханнун Ясир
источник
20
В одной строке: $ date = new DateTime («последний день этого месяца»);
Гарольд
6
Возможно, вы захотите добавить $ date-> modify ('последний день этого месяца') -> setTime (23,59,59); если вы хотите использовать этот dateTime для сравнения, когда время имеет значение. (Это дает вам последнюю секунду месяца)
omgitsdrobinoha
5
Это работает:$date = new DateTime('last day of 2020-2');
4
@ Джон, ты не прав. последний день рассчитывается с использованием объекта $ date, а не системной даты. Попробуйте это, изменив первую строку следующим образом:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir
5
Если бы вы подумали или хотя бы попробовали то, что я просил вас сделать, вы бы увидели, что этот месяц означает значение месяца в объекте DateTime, а не системную дату. Если вы не можете набрать / запустить php-код, это может помочь: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir
76

Есть также встроенная функция PHP cal_days_in_month () ?

«Эта функция будет возвращать количество дней в месяце года для указанного календаря». http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
источник
2
Этот ответ намного проще и уместнее, чем использование strtoTime. Я не вижу никаких минусов. К вершине вы идете.
Томас Зубири
Это должен был быть принятый ответ.
sieppl
24

Это должно работать:

$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/>';
kaleazy
источник
18

Что не так - самым элегантным для меня является использование DateTime

Интересно не вижу DateTime::createFromFormat, однострочник

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");
Джон Смит
источник
2
Согласен. Это решение (класс DateTime) намного лучше, чем использование старых функций datetime.
schellingerht
17

Вы можете создать дату первого числа следующего месяца, а затем использовать strtotime("-1 day", $firstOfNextMonth)

nikc.org
источник
альтернативный метод, использующий тот же подход, состоит в том, чтобы дать mktime 0-й день следующего месяцаmktime(0, 0, 0, $month+1, 0, $year);
Джордж
Как по мне, использование так strtotime()и mktime()не рекомендуется, потому что. из известных ошибок, таких как определение даты на границе месяцев и високосных годов. Поскольку DateTimeон доступен, вы должны использовать этот класс, чтобы избежать каких-либо проблем в будущем. Как много раз было сказано до меня, обе эти функции strtotime()и mktime()потерпят неудачу после 2038 года. Вот почему я понизил голосование ...
Пол Т. Роукин
@ PaulT.Rawkeen Этому ответу более 4 лет. Как и все в Интернете, возраст должен быть фактором при оценке актуальности и полезности. Более того, ИМХО, время наполовину для всего, что связано с технологиями, особенно мало.
nikc.org
@ nikc.org Я согласен, особенно в отношении времени жизни для всех технических решений и способов решения проблем. В этом конкретном случае, ответ имеет относительно большое количество голосов, и, возможно, кто-то ( младший программист ) посчитает этот ответ приемлемым решением. он короткий и элегантный :) и он, вероятно, получит ожидаемый результат, но со временем этот способ решения подобных проблем становится хитрым, и мы должны предупреждать о таких фактах, когда это возможно. С уважением .
Пол Т. Рокин
16

Попробуйте это, если вы используете 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');

Чтобы найти в следующем месяце последнюю дату, измените ее следующим образом:

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

и так далее..

Мохаммед Сейфер
источник
11

Ваше решение здесь ..

$lastday = date('t',strtotime('today'));
Винеет Кадкол
источник
1
это дает 31для Septemberчего, как вы знаете, это не правильно.
Ильясс Хамза
10

Вы можете найти последний день месяца несколькими способами. Но просто вы можете сделать это, используя PHP strtotime () и функцию date (). Я думаю, ваш окончательный код будет выглядеть примерно так:

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

Live Demo

Но если вы используете PHP> = 5.2, я настоятельно рекомендую вам использовать новый объект DateTime. Например, как показано ниже:

$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

Кроме того, вы можете решить эту проблему, используя свою собственную функцию, как показано ниже:

/**
 * 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);
Фейсал
источник
Спасибо за вашу функцию, она работает, как я ожидал :)
Mankeomorakort
7

Если вы используете расширение Carbon API для PHP DateTime, вы можете получить последний день месяца с помощью:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 
eaykin
источник
На самом деле, если вы установите день -1, он получит последний, но один. Таким образом, вы должны установить день на 0, чтобы получить последний день. $date->day = 0;
Джованна Афонсо
спасибо @GiovanneAfonso, это правильно. Я установил день на 0 и проверил ответ.
Эйкин
1
Если вы используете Carbon, однострочный подход заключается в использовании: Carbon :: Now () -> endOfMonth (). Однако endOfMonth () является модификатором, поэтому используйте «клон», если у вас есть существующая переменная, содержащая дату углерода (или дата будет изменена).
Чарли Далсасс
4

Вы также можете использовать его с datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');
Ajouve
источник
4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');
Кейла
источник
2

Используя Zend_Date это довольно просто:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
источник
2

Если у вас есть месяц, получите последнюю дату месяца,

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

$this->getLastDateOfMonth(01); //31
Каушик Шримали
источник
1

Вот полная функция:

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

Это вывело бы следующее:

echo get_number_of_days_in_month(2,2014);

Выход: 28

Firze
источник
1

Есть способы получить последний день месяца.

//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]); 
Vineet
источник
1

Другой способ с использованием mktime, а не даты ('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 :)

Таким образом, он рассчитывает либо 31,30, либо 29

Робин Рюмо
источник
1

Я опоздал, но есть несколько простых способов сделать это, как упоминалось:

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

Использование mktime () - это мой путь для полного контроля над всеми аспектами времени ... IE

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

Если установить день равным 0 и переместить месяц вверх на 1, у вас будет последний день предыдущего месяца. 0 и отрицательные числа имеют одинаковое влияние в различных аргументах. PHP: mktime - руководство

Как уже говорили некоторые, strtotime - не самый надежный путь, и мало, если не все так легко универсальны.

JSG
источник
1

Я использую strtotime с cal_days_in_month следующим образом:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));
user2448808
источник
0

Расширение Carbon API для PHP DateTime

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

или

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

вернусь

30
йозеф
источник
-1
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

Kevin
источник
-2

Это гораздо более элегантный способ получить конец месяца:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 
Луи Стерио
источник
-3

Вы можете использовать " t" в функции даты, чтобы получить номер дня в определенном месяце.

Код будет примерно таким:

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

Код самоочевиден. Надеюсь, это поможет.

NawaMan
источник