PHP dateTime в предыдущем месяце 31 De c неверно - PullRequest
0 голосов
/ 09 января 2020

У меня есть это:

$previousMonth = new DateTime('2019-12-31');
$previousMonth->modify('-1 month');

Насколько я понимаю, '-1 месяц' должен изменять объект независимо от количества дней в этом месяце, или?

Естественно, что я должен получить или ожидать, что это конец ноября (2019-11-30), но то, что я получу, это первое декабря (того же месяца). Кстати, если я поменяю дату на «2019-12-30» (за день до этого), то это будет конец ноября.

Если мое первоначальное предположение неверно, то какова лучшая альтернатива для надежного расчета предыдущий месяц? Есть мысли?

Ответы [ 3 ]

0 голосов
/ 09 января 2020

Самый простой и легкий способ получить последний месяц в php - это

$previousMonth = date("Y-n-j", strtotime("last day of previous month"));

То же, что было предложено в другой теме Получение даты последнего месяца в php

0 голосов
/ 09 января 2020
$date = "2019-12-31 00:00:00";
echo date('Y-m-d', strtotime($date . '-1month'));

Это распечатывает 2019-12-01, поскольку 31/11 не существует.

Следующее не отвечает на ваш вопрос, но может помочь в будущем. Мне нравится использовать Carbon при работе с датами. Ваша проблема может быть решена довольно просто с этим.

https://carbon.nesbot.com/

Он имеет множество функций и чрезвычайно прост в использовании, и его можно установить с помощью Composer.

0 голосов
/ 09 января 2020

Чтобы получить последний день предыдущего месяца, вы можете получить первый день текущего месяца и вычесть 1 секунду или 1 день:

$previousMonth = new DateTime('2019-12-31');
$previousMonth->modify($previousMonth->format('Y-m-01')); // date is 2019-12-01 00:00:00
$previousMonth->modify('-1 sec');
echo $previousMonth->format('Y-m-d H:i:s') . PHP_EOL; // Outputs 2019-11-30 23:59:59

$previousMonth->modify('+1 sec'); // set back the original date 2019-12-01 00:00:00
$previousMonth->modify('-1 day');
echo $previousMonth->format('Y-m-d H:i:s'); // Outputs 2019-11-30 00:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...