Я немного не уверен, почему это не может найти последний день предыдущего месяца. Кажется, что все шаги работают правильно, за исключением случаев, когда создается окончательная дата.
<?php $currentMonth = date('n'); $currentYear = date('Y'); if($currentMonth == 1) { $lastMonth = 12; $lastYear = $currentYear - 1; } else { $lastMonth = $currentMonth -1; $lastYear = $currentYear; } if($lastMonth < 10) { $lastMonth = '0' . $lastMonth; } $lastDayOfMonth = date('t', $lastMonth); $lastDateOfPreviousMonth = $lastYear . '-' . $lastMonth . '-' . $lastDayOfMonth; $newLastDateOfMonth = date('F j, Y', strtotime($lastDateOfPreviousMonth)); ?>
$lastDateOfPreviousMonth
возвращает 2012-09-30, как и ожидалось; однако, после попытки конвертировать его до 30 сентября 2012 года – $newLastDateOfMonth
возвращается 1 октября 2012 года. Где я, кажется, ошибаюсь?
EDIT: если используется date("t/m/Y", strtotime("last month"));
или date('Ym-d', strtotime('last day of previous month'));
будет ли любой из них по-прежнему жизнеспособным в 2013-01-01 годах, т.е. будут ли они учитывать изменения в году?
echo date('Ym-d', strtotime('last day of previous month')); //2012-09-30
или
$date = new DateTime(); $date->modify("last day of previous month"); echo $date->format("Ymd");
Позже отредактируйте: документация php.net – относительные форматы для strtotime (), DateTime и date_create ()
Для этого есть php-функция.
echo date("t/m/Y", strtotime("last month"));
Первый день этого месяца минус 1 секунда.
echo date('Ym-d',strtotime('-1 second',strtotime(date('m').'/01/'.date('Y'))));
Пример здесь .
Для достижения этой цели вы можете использовать функции обработки нулевой точки strtotime()
:
# Day Before echo date('Ym-d', strtotime('2016-03-00')); // 2016-02-29 # Year can be handled too echo date('Ym-d', strtotime('2016-01-00')); // 2015-12-31 # Month Before echo date('Ym-d', strtotime('2016-00-01')); // 2015-12-01 # Month AND Day echo date('Ym-d', strtotime('2016-00-00')); // 2015-11-30
Имеет смысл, если вы думаете о 00 как «на один меньше, чем первый (01)».
Поэтому для достижения цели этого вопроса «последний день предыдущего месяца» является простым примером
date('your_format', strtotime('YYYY-ThisMonth-00')); # So: date('Ym-d', strtotime('2016-11-00')); // 2016-10-31