Вопрос:

Поиск последнего дня предыдущего месяца в PHP

php datetime

33341 просмотра

5 ответа

721 Репутация автора

Я немного не уверен, почему это не в состоянии найти последний день предыдущего месяца. Кажется, что все шаги работают правильно, кроме тех случаев, когда создается окончательная дата.

<?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 года. Где я, кажется, иду не так?

РЕДАКТИРОВАТЬ: При использовании date("t/m/Y", strtotime("last month"));или date('Y-m-d', strtotime('last day of previous month'));будет ли любой из них все еще жизнеспособным, учитывая 2013-01-01, то есть они будут учитывать изменения в году?

Автор: William Orazi Источник Размещён: 01.10.2012 01:15

Ответы (5)


74 плюса

34370 Репутация автора

Решение
echo date('Y-m-d', strtotime('last day of previous month'));
//2012-09-30

или же

$date = new DateTime();
$date->modify("last day of previous month");
echo $date->format("Y-m-d");

Позднее редактирование: документация php.net - относительные форматы для strtotime (), DateTime и date_create ()

Автор: Mihai Iorga Размещён: 01.10.2012 01:17

4 плюса

4146 Репутация автора

Первый день этого месяца, минус 1 секунда.

echo date('Y-m-d',strtotime('-1 second',strtotime(date('m').'/01/'.date('Y'))));

Пример тут .

Автор: wesside Размещён: 01.10.2012 01:19

20 плюса

313 Репутация автора

Для этого есть функция php.

echo date("t/m/Y", strtotime("last month"));
Автор: Lea Размещён: 01.10.2012 01:19

1 плюс

171 Репутация автора

Вы можете использовать strtotime()нулевую функциональность обработки для достижения этого также:

# Day Before
    echo date('Y-m-d', strtotime('2016-03-00')); // 2016-02-29

# Year can be handled too
    echo date('Y-m-d', strtotime('2016-01-00')); // 2015-12-31

# Month Before
    echo date('Y-m-d', strtotime('2016-00-01')); // 2015-12-01

# Month AND Day
    echo date('Y-m-d', strtotime('2016-00-00')); // 2015-11-30

Имеет смысл, если вы думаете о 00 как «один меньше, чем первый (01)».

Таким образом, для достижения цели этого вопроса «последний день предыдущего месяца» является простым случаем

date('your_format', strtotime('YYYY-ThisMonth-00'));
# So:
date('Y-m-d', strtotime('2016-11-00')); // 2016-10-31
Автор: Dan Streeter Размещён: 26.11.2016 09:57

0 плюса

858 Репутация автора

пожалуйста, попробуйте с ответом ниже.

код:

echo date("t/m/Y", strtotime(date('Y-m')." -1 month"));

Вы получите последний день предыдущих 12 месяцев.

Пример:

    <?php
for ($i = 1; $i <= 12; $i++) {
    $months[] = date("t/m/Y l", strtotime(date('Y-m')." -$i months"));
}
print_r($months);
?>

Выход:

Array
(
    [0] => 30/11/2018 Monday
    [1] => 31/10/2018 Friday
    [2] => 30/09/2018 Wednesday
    [3] => 31/08/2018 Sunday
    [4] => 31/07/2018 Thursday
    [5] => 30/06/2018 Tuesday
    [6] => 31/05/2018 Saturday
    [7] => 30/04/2018 Thursday
    [8] => 31/03/2018 Monday
    [9] => 28/02/2018 Monday
    [10] => 31/01/2018 Friday
    [11] => 31/12/2017 Tuesday
)
Автор: stalinrajindian Размещён: 19.12.2018 02:35
Вопросы из категории :
32x32