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

Вот код, который я использую:

    for ($i = 0; $i <= 12; $i++) {
        $start[] = date("Y-m-01", strtotime( date( 'Y-m-01' )." -$i months"));
        $end[] = date( 'Y-m-t', strtotime($start[$i]. -1*$i .' month') );

        echo $start[$i] . " - " . $end[$i] . "<br/>";
    }

Это производит:

2015-10-01 – 2015-10-31
2015-09-01 – 2015-08-31
2015-08-01 – 2015-06-30
2015-07-01 – 2015-04-30
2015-06-01 – 2015-02-28
2015-05-01 – 2014-12-31
2015-04-01 – 2014-10-31
2015-03-01 – 2014-08-31
2015-02-01 – 2014-06-30
2015-01-01 – 2014-04-30
2014-12-01 – 2014-02-28
2014-11-01 – 2013-12-31
2014-10-01 – 2013-10-31

Обратите внимание, что последний день сентября неверен (31 августа - последний день). Это происходит в течение нескольких месяцев.

Любые идеи?

6
Nicholas 27 Окт 2015 в 06:08

2 ответа

Лучший ответ

Какой желаемый результат? Я полагаю, вы просто пытаетесь отобразить первый и последний дни месяца? Ваш код повторяется по $i. Таким образом, каждый раз, когда он повторяется, он удаляет 0 месяцев, 1 месяц, 2, 3, 4, 5 ... и т. Д.

Просто удалите этот код полностью. Y-m-t подойдет.

for ( $i = 0; $i <= 12; $i++ ) {
    $start[] = date('Y-m-01', strtotime( date( 'Y-m-01' )." -$i months"));
    $end[]   = date('Y-m-t',  strtotime( $start[$i] ) );

    echo $start[$i] . " - " . $end[$i] . "<br/>";
}

Результаты в

2015-10-01 - 2015-10-31
2015-09-01 - 2015-09-30
2015-08-01 - 2015-08-31
2015-07-01 - 2015-07-31
2015-06-01 - 2015-06-30
2015-05-01 - 2015-05-31
2015-04-01 - 2015-04-30
2015-03-01 - 2015-03-31
2015-02-01 - 2015-02-28
2015-01-01 - 2015-01-31
2014-12-01 - 2014-12-31
2014-11-01 - 2014-11-30
2014-10-01 - 2014-10-31
5
Christian 27 Окт 2015 в 03:21

Я предполагаю, что это из-за вашей итерации при установке $end[]. Однако это, похоже, работает:

for ($i = 0; $i <= 12; $i++) {
    $start[] = date("Y-m-01", strtotime( date( 'Y-m-01' )." - $i months"));
    $end[] = date("Y-m-t",strtotime("last day of " . date("Y-m", strtotime($start[$i]))));

    echo $start[$i] . " - " . $end[$i] . "\n";
}

Или как ответил @Christian Varga:

$end[]   = date('Y-m-t',  strtotime( $start[$i] ) );

Что возвращает:

2015-10-01 - 2015-10-31
2015-09-01 - 2015-09-30
2015-08-01 - 2015-08-31
2015-07-01 - 2015-07-31
2015-06-01 - 2015-06-30
2015-05-01 - 2015-05-31
2015-04-01 - 2015-04-30
2015-03-01 - 2015-03-31
2015-02-01 - 2015-02-28
2015-01-01 - 2015-01-31
2014-12-01 - 2014-12-31
2014-11-01 - 2014-11-30
2014-10-01 - 2014-10-31

Пример / Демо

1
Community 23 Май 2017 в 12:29