我在開發過程當中遇到這麼這個問題,由於趕進度,沒有記下來處理方案,在鳥哥的博客看到原理分析,很到位!平時開發中老是急着處理問題,沒有深刻分析和記錄問題。
一、問題:
今天是2018-07-31 執行代碼:date("Y-m-d",strtotime("-1 month"))
輸出是2018-06-01?html
二、分析:
- 先作-1 month, 那麼當前是07-31, 減去一之後就是06-31.
- 再作日期規範化, 由於6月沒有31號, 因此就好像2點60等於3點同樣, 6月31就等於了7月1
2-一、驗證
var_dump(date("Y-m-d", strtotime("2017-06-31")));
//輸出2017-07-01
只要涉及到大小月的最後一天, 均可能會有這個問題segmentfault
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2017-03-31"))));
//輸出2017-03-03
var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2017-08-31"))));
//輸出2017-10-01
var_dump(date("Y-m-d", strtotime("next month", strtotime("2017-01-31"))));
//輸出2017-03-03
var_dump(date("Y-m-d", strtotime("last month", strtotime("2017-03-31"))));
//輸出2017-03-03
2-二、處理方案
-
PHP5.3以後的版本處理方式
」first day of」 和 「last day of」, 也就是你能夠限定好不要讓date自動」規範化」code
``` var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2017-03-31")))); //輸出2017-02-28 var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2017-08-31")))); ////輸出2017-09-01 var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2017-01-31")))); ////輸出2017-02-01 var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2017-03-31")))); ////輸出2017-02-28 ```
- 使用mktime之類的, 把全部的日子忽略掉, 好比都限定爲每個月1號就能夠了, 只不過就不如直接用first day來的更加優雅
參考資料:http://www.laruence.com/2018/...htm
原文地址:http://www.javashuo.com/article/p-nkoovvmh-gd.html開發