получение проблемы за предыдущие 6 месяцев

#php

#php

Вопрос:

Я столкнулся с проблемой получения последних 6 месяцев на основе номера месяца

     $vBillMonthPrev = '11';

        for ($i = 1; $i < 7; $i  ) {
            $m_array[] = date("M-y", mktime(0, 0, 0, $vBillMonthPrev - $i, 15));
        }

foreach ($m_array as $months) {
           echo  $months;
        }
 

проблема в том, что приведенный выше код возвращает Oct-21Sep-21Aug-21Jul-21Jun-21May-21
, и требуемый результат должен быть Oct-20 Sep-20 Aug-20 Jul-20 Jun-20 May-20

Комментарии:

1. потому что требуется распечатать историю выставления счетов за предыдущий месяц с указанием месяцев и года

2. @JohnConde это требования для печати истории предыдущих месяцев в пользовательском билете

3. Но сейчас 2021 год, так как mktime узнать, что вы имеете в виду 2020 год?

4. вы правы, но это требования для печати истории за предыдущие 6 месяцев в счете потребителя, например, если текущий месяц в счете — ноябрь 2020 года, история предыдущих месяцев будет отображаться в счете типа Oct-20 Sep-20 Aug-20 Jul-20 Jun-20 May-20, но этоотображается 2021.

Ответ №1:

Один из способов справиться с вашей проблемой за год — сравнить $vBillMonthPrev с текущим месяцем, и если он больше, чем этот, указав year параметр mktime , который относится к предыдущему году. Затем вы можете создать DateTime объект с этой даты и вычесть один месяц в цикле для генерации значений в вашем $m_array . Обратите внимание, что предпочтительнее вычитать месяц за раз, а не создавать новую переменную даты, поскольку это будет корректно обрабатывать случай, когда месяц перетекает в предыдущий год.

 $vBillMonthPrev = '11';
$vBillYearPrev = (int)date('Y') - ((int)$vBillMonthPrev > (int)date('n') ? 1 : 0);

$date = date_create_from_format('U', mktime(0, 0, 0, $vBillMonthPrev, 15, $vBillYearPrev));

$m_array = array();
for ($i = 1; $i < 7; $i  ) {
    $date->modify('-1 month');
    $m_array[] = $date->format('M-y');
}

print_r($m_array);
 

Вывод:

 Array
(
    [0] => Oct-20
    [1] => Sep-20
    [2] => Aug-20
    [3] => Jul-20
    [4] => Jun-20
    [5] => May-20
)
 

Демонстрация на 3v4l.org

Ответ №2:

просто добавьте параметр year точно так же

 <?php
    $vBillMonthPrev = '11';
    for ($i = 1; $i < 7; $i  ) {
        $m_array[] = date("M-y", mktime(0, 0, 0, $vBillMonthPrev - $i, 15, 2020));
    }

   foreach ($m_array as $months) {
       echo  $months;
    }
?>