strtotime () 的-1month 的問題

小滕發表於2018-09-18

在PHP當中我們可以這樣獲取距離當前時間的每個月的月份,比如說下面的程式碼是獲取當前時間往前的12個月份:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month')) . "\n";
    $i--;
}

輸出結果:

2017-09
2017-10
2017-11
2017-12
2018-01
2018-02
2018-03
2018-04
2018-05
2018-06
2018-07
2018-08

寫部落格時是9月3號。

輸出的結果沒有問題,可以獲取到當前之間前面的12個月份。但是下面這個情況就無法輸出正確的結果了:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month', strtotime('2018-8-31 12:00'))) . "\n";
    $i--;
}

輸出結果:

2017-08
2017-10
2017-10
2017-12
2017-12
2018-01
2018-03
2018-03
2018-05
2018-05
2018-07
2018-07

為什麼出現這種情況?因為每個月的天數是不一樣的,所以如果帶上天數的話會出現bug的,特別是在每月的31號。可以用下面的方法解決:

<?php

$i = 12;

while($i >= 1) {
    echo date('Y-m', strtotime('-' . $i . ' month', strtotime('2018-8'))) . "\n";
    $i--;
}

輸出結果:

2017-08
2017-09
2017-10
2017-11
2017-12
2018-01
2018-02
2018-03
2018-04
2018-05
2018-06
2018-07

唯一變動的地方是 strtotime('2018-8')

原文地址:《小滕部落格》