前几个月的最后一天计算错误


Last day of previous months calculating wrong

我在计算前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

请注意,9月的最后一天不正确(显示8月31日为最后一天)。这种情况持续数月。

有什么想法吗?

想要的结果是什么?我想你只是想显示一个月的第一天和最后一天?您的代码在$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

我认为这是因为您在设置$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

示例/演示