Получите 3 предыдущих месяца в PHP, показывая тот же результат - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно 3 предыдущих месяца с текущего месяца. Я получил этот код из stackoverflow ЗДЕСЬ

  echo date('M Y', strtotime('-0 month'));
  echo date('M Y', strtotime('-1 month'));
  echo date('M Y', strtotime('-2 month'));
  echo date('M Y', strtotime('-3 month'));

Результат должен быть

Mar 2020
Feb 2020
Jan 2020
Dec 2019

Но я получаю

Mar 2020
Mar 2020
Jan 2020
Dec 2019

В чем проблема? это из-за високосного года февраль?

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

"это из-за високосного года февраль? ' - Да, это как-то связано с этим.

Согласно инструкции на strtotime():

от примечание, внесенное пользователем :

В зависимости от дня месяца, вы можете получить другой ответ. не високосный год, вы получите март, если текущий день месяца будет 29-го, 30-го или 31-го. Если это високосный год, вы получите март 30-го или 31-го числа месяца То же самое произойдет 31-го числа каждого месяца, когда вы передадите имя любого месяца, в котором менее 31 дня. Это происходит потому, что функция strtotime () заполнит недостающие части текущего дня.

1 голос
/ 31 марта 2020

Ну, я предлагаю вам использовать библиотеку DateTime PHP. Вот так:

$today = new DateTime();
$today->modify('last day of previous month');
echo $today->format('M') . '\n';
$today->modify('last day of previous month');
echo $today->format('M') . '\n';
$today->modify('last day of previous month');
echo $today->format('M') . '\n';

у вас будут следующие ответы:

Feb
Jan
Dev

Для более подробной информации: https://www.php.net/manual/fr/datetime.modify.php

1 голос
/ 31 марта 2020

Я также новичок в этой концепции, но это то, что я нашел, и, похоже, работает. Когда вы используете strtotime('-1 month'), вы получите 31 февраля. Этот день не существует, поэтому, вероятно, это и является причиной проблемы.

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

  echo date('M Y', strtotime('first day of -0 month'));
  echo date('M Y', strtotime('first day of -1 month'));
  echo date('M Y', strtotime('first day of -2 month'));
  echo date('M Y', strtotime('first day of -3 month'));

Написав «первый день» до - * месяца, вы получите первый день вместо этого.

Проверьте: https://www.php.net/datetime.formats.relative, где вы можете найти все форматы, которые вы можете использовать.

...