Як знайти останній день місяця від дати?


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-> формат ('Ymt');
Мугунт

74
@Mugunth Якщо ви працюєте з датами 24 роки в майбутньому, ви можете зіткнутися з проблемами раніше 2038 року, однак сервери вже переходять на 64-бітну архітектуру, яка дасть нам близько 292 мільярдів років для виправлення проблеми.
Немає

1
в процедурному -> $ date1 = $ рік .'- '. $ місяць; $ 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, ви можете використовувати getInMonth 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' );

17
Мені буде 71 рік і на пенсію до цього часу, тому для мене це не проблема! j / k Але серйозно, люди - прислухайтесь до цього попередження!
Воломіке

17
Це передбачає, що ви використовуєте 32-бітну версію PHP.
Ні

чому цей тривожний факт про strtotime не згадується в php docu php.net/manual/de/function.strtotime.php ?
Адам

1
@Adam Це зараз, не впевнений, чи був він, коли ви перевіряли. php.net/manual/de/…
Mave

1
Станом на 2018 рік strtotimeкод дає мені такий результат: 2040-11-30
Jee

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
@John ви помиляєтесь. останній день обчислюється за допомогою об’єкта $ 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

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

18

Що не так - Найелегантніше для мене - використання DateTime

Цікаво, що я не бачу DateTime::createFromFormat, однолінійний

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

2
Я згоден. Це рішення (клас DateTime) набагато краще, ніж використання старих функцій дати.
schellingerht

17

Ви можете створити дату для першого наступного місяця, а потім використовувати strtotime("-1 day", $firstOfNextMonth)


альтернативним методом, що використовує той самий підхід, є надання mktime 0-го числа наступного місяцяmktime(0, 0, 0, $month+1, 0, $year);
Джордж

Як на мене, використання strtotime()та mktime()перешкоджає б. відомих помилок, таких як визначення дати на межі місяців та показники високосного року. Оскільки DateTimeце доступно, ви повинні використовувати цей клас, щоб уникнути будь-яких проблем у майбутньому. Як сказав багато разів до мене, обидві ці функції strtotime()і mktime()не зможе після 2038 Ось чому я downvoted ...
Paul T. Rawkeen

@ PaulT.Rawkeen Цій відповіді більше 4 років. Як і в Інтернеті, вік повинен бути фактором для оцінки актуальності та корисності. Більше того, IMHO, час вдвічі на все, що стосується технології, особливо короткий.
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');

і так далі..



10

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

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

Демонстраційна демонстрація

Але якщо ви використовуєте 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');

Демонстраційна демонстрація

Також ви можете вирішити це за допомогою власної функції, як показано нижче:

/**
 * 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

Якщо ви використовуєте розширення API Carbon для PHP DateTime, останній день місяця ви можете отримати за допомогою:

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

Насправді, якщо встановити день -1, він отримає останній, але не один. Тому ви повинні встановити день 0, щоб отримати останній день. $date->day = 0;
Джованні Афонсо

дякую @GiovanneAfonso це правильно. Я встановив день 0 і перевірив відповідь.
eaykin

1
Якщо ви використовуєте Carbon, слід використовувати однолінійний підхід: Carbon :: Now () -> endOfMonth (). Однак endOfMonth () є модифікатором, тому використовуйте "clone", якщо у вас є наявна змінна, що містить дату Carbon (або дата буде змінена).
Чарлі Далсасс

4

Ви також можете використовувати його з датою

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

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

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


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

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 - це не найсміливіший шлях, і мало, якщо жоден не є дуже універсальним.


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


0

Інший спосіб використання 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


0

Розширення API Carbon для 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


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

Код пояснюється самостійно. Тож сподіваємось, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.