Получить последние 12 месяцев в PHP - PullRequest
21 голосов
/ 01 сентября 2011

Итак, вот интересная проблема, которую я узнал сегодня.

Мне нужно заполнить массив за последние 12 месяцев, начиная с прошлого месяца.Таким образом, в августе 2011 года последние 12 месяцев будут сентябрь 2010 года - июль 2011 года. Для этого я использую:

for ($i = 1; $i <= 12; $i++)
    $months[] = date("Y-m%", strtotime("-$i months"));

Приведенный выше код прекрасно работает 30 августа. Я получаю последние 12 месяцев:

array
    0 => string '2011-07%' (length=8)
    1 => string '2011-06%' (length=8)
    2 => string '2011-05%' (length=8)
    3 => string '2011-04%' (length=8)
    4 => string '2011-03%' (length=8)
    5 => string '2011-02%' (length=8)
    6 => string '2011-01%' (length=8)
    7 => string '2010-12%' (length=8)
    8 => string '2010-11%' (length=8)
    9 => string '2010-10%' (length=8)
    10 => string '2010-09%' (length=8)
    11 => string '2010-08%' (length=8)

Но когда я запускаю это 31 августа, я получаю:

array
    0 => string '2011-07%' (length=8)
    1 => string '2011-07%' (length=8)
    2 => string '2011-05%' (length=8)
    3 => string '2011-05%' (length=8)
    4 => string '2011-03%' (length=8)
    5 => string '2011-03%' (length=8)
    6 => string '2011-01%' (length=8)
    7 => string '2010-12%' (length=8)
    8 => string '2010-12%' (length=8)
    9 => string '2010-10%' (length=8)
    10 => string '2010-10%' (length=8)
    11 => string '2010-08%' (length=8)

Я пробовал Windows и Unix.У кого-нибудь есть решение для этого?

Ответы [ 5 ]

54 голосов
/ 01 сентября 2011

Я уверен, что у кого-то есть более элегантное решение, но вы можете начать обратный отсчет с 1-го числа этого месяца.

for ($i = 1; $i <= 12; $i++) {
    $months[] = date("Y-m%", strtotime( date( 'Y-m-01' )." -$i months"));
}
1 голос
/ 27 сентября 2018

Я думаю, что это будет работать:

<code>$this_month = date("n", time());
$this_year = date("Y", time());
$months_array = array();
for ($i = $this_month - 1; $i > ($this_month - 13); $i--) {
    echo "$i<br>";
    if ($i < 1) {
        $correct_month_number = $i + 12;
        $months_array[] = array($correct_month_number, $this_year - 1);
    }
    else {
        $months_array[] = array($i, $this_year);
    }
}
echo "<pre>"; var_dump($months_array); echo "
";

Типы данных немного свободны, но это делает работу. Приятно то, что это тольковызывает функцию date () для текущего месяца и года, один раз. Остальная логика - просто математика. Не нужно беспокоиться о длине каждого месяца.

Тогда вы можете использовать массив $ months_arrayпостроить все, что вам нужно.

1 голос
/ 01 сентября 2011

Это потому, что не каждый месяц имеет 31-е.Так что strtotime() продвигается к следующему месяцу.то есть 4/31 = 5 / 1.

Вам лучше использовать mktime() для этого, так как тупее , чем strtotime().

ОБНОВЛЕНИЕ

Чтобы воспользоваться функцией smart , такой как strtotime(), и избежать отслеживания года для mktime(), я предлагаю следующее:

$month = time();
for ($i = 1; $i <= 12; $i++) {
  $month = strtotime('last month', $month);
  $months[] = date("r", $month);
}
print_r($months);

Настройте логику и оптимизируйтекак считаете нужным.

0 голосов
/ 01 сентября 2011

Проблема в том, что для PHP, месяц всегда будет иметь 30 дней, следовательно, 31 августа минус 1 месяц по-прежнему август. Следующий код может быть не самым эффективным или блестящим, но он выполняет свою работу:

<?php

$m = strftime('%m');
$y = strftime('%Y');

for($i=1; $i<12; $i++)
{
    $m--;
    if($m <= 0)
    {
        $y--;
        $m = 12;
    }
    print "$y-$m\n";
}

?>
0 голосов
/ 01 сентября 2011

радости разной продолжительности месяца. strtotime в буквальном смысле слова, и принимает «31 августа» и tryinn, чтобы сделать «31 сентября», который не существует. Таким образом, вы в конечном итоге с 1 октября или что-то. Более безопасный подход заключается в следующем:

for ($i = 1; $i <= 12; $i++) {
    $months[] = date("Y-m%", mktime(0, 0, 0, $i, 1, 2011));
}

strtotime иногда волшебен, но он ненадежен и, конечно, не "быстр".

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