PHP не дает правильного вывода для вычитания месяца - PullRequest
0 голосов
/ 21 апреля 2020

Код:

$time = strtotime('2020-03-31'); echo date('Y-m-d', strtotime('-1 month', $time));

Ожидаемый результат: Любая дата с февраля 2020 г.

Фактический результат: 2020-03-02

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

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Месяцы - неудобный интервал для работы, потому что они не имеют фиксированной длины. Должен ли алгоритм предполагать, что под «1 месяцем» вы подразумеваете «30 дней» или «31 день», или он должен просто попытаться вычесть 1 из поля «месяц» в структуре даты?

Последний вариант это то, что происходит здесь: учитывая "2020-03-31", библиотека дат PHP вычитает 1 из "03", чтобы дать "2020-02-31". Поскольку это недопустимая дата (в феврале 2020 года было 29 дней), она «нормализует» ее до реальной даты - через 2 дня после того, как 29 февраля было 2 марта.

Возможно, вы хотите использовать более конкретную c период для вычитания, например, 30 дней - хотя учтите, что если в качестве исходного ввода указано «2020-03-01», это даст вам «2020-01-31», а не «2020-02-01».

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

0 голосов
/ 21 апреля 2020

Вы можете сделать код, как показано ниже

<?php
$time = strtotime('2020-03-1 -32 days');
echo date('M-Y', $time); // output Feb-2020
?>

Приведенный выше код вернет дату, как вы ожидали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...