後來研究發現是每個月的31號才會發生的BUG
REF : PHP strtotime +1 month adding an extra month [duplicate]

還原問題 (精簡)

test.php

1
2
3
4
5
6
7
<?php
echo date('Y-m-d H:i:s') . "\n";
echo date('Y-m-d H:i:s', strtotime("1 month")) . "\n";
echo date('Y-m-d', strtotime("2 month")) . "\n";
echo date('Y-m-d', strtotime("3 month")) . "\n";
echo date('Y-m-d', strtotime("4 month")) . "\n";
echo date('Y-m-d', strtotime("5 month")) . "\n";

執行後

1
2
3
4
5
6
7
root@98006f117e53:~# php ./test.php
2019-05-31 08:56:23  ---> 今天日期
2019-07-01 08:56:23  ---> 原本只要 +1 month, 結果變成 +2 month
2019-07-31
2019-08-31
2019-10-01
2019-10-31

因為6月只有30天,結果05-30在程式處理時 1 month加30天,所以得到07-01 顯然不是我們要的結果

如何處理

透過 last day of這個關鍵字來處理
雖然會得到每個月最後一日ex: 30、31
但沒關係,我們主要是要得到正確的年/月

test.php

1
2
3
4
5
6
7
<?php
echo date('Y-m-d H:i:s') . "\n";
echo date('Y-m-d H:i:s', strtotime("last day of 1 month")) . "\n";
echo date('Y-m-d', strtotime("last day of 2 month")) . "\n";
echo date('Y-m-d', strtotime("last day of 3 month")) . "\n";
echo date('Y-m-d', strtotime("last day of 4 month")) . "\n";
echo date('Y-m-d', strtotime("last day of 5 month")) . "\n";

修正後,月分顯示就正常了

1
2
3
4
5
6
7
root@98006f117e53:~# php ./test.php
2019-05-31 09:01:34
2019-06-30 09:01:34
2019-07-31
2019-08-31
2019-09-30
2019-10-31