-
加入我們
-
VIP定制
-
求關(guān)注
Thank you for visiting
029-81773686
全網(wǎng)開發(fā)&整合營銷服務(wù)商
CopyRight
?HOOBOO All rights reserved
2020.09.11
PHP關(guān)于strtotime函數(shù)的BUG問題與解決方案
最近使用了strtotime結(jié)合-1 month, +1 month, next month獲取上個月或者下個月的日期,不過剛看到一篇文章,才知道原來使用strtotime直接獲取日期還是有點小BUG
如日期:
$today = '2020-10-31';
var_dump( date("Y-m-d",strtotime("$today -1 month")) ); // 輸出:2020-10-01
根據(jù)上面的輸出可以看出來,輸出的還是2020年10月
分析:
先做-1 month, 那么當(dāng)前是07-31, 減去一以后就是06-31.
再做日期規(guī)范化, 因為6月沒有31號, 所以就好像2點60等于3點一樣, 6月31就等于了7月1
是不是邏輯很“清晰”呢? 再舉個例子 比如:
var_dump( date("Y-m-d", strtotime("2020-12-31")) ); // 輸出2020-12-01
也就是說, 只要涉及到大小月的最后一天, 都可能會有這個迷惑, 我們也可以很輕松的驗證類似的其他月份, 印證這個結(jié)論:
var_dump( date("Y-m-d", strtotime("-1 month", strtotime("2020-12-31"))) ); // 輸出2020-12-03
var_dump( date("Y-m-d", strtotime("+1 month", strtotime("2020-08-31"))) ); // 輸出2020-10-01
var_dump( date("Y-m-d", strtotime("next month", strtotime("2020-01-31"))) ); // 輸出2020-03-03
var_dump( date("Y-m-d", strtotime("last month", strtotime("2020-03-31"))) ); // 輸出2020-03-03
解決方案
從PHP5.3開始呢, date新增了“first day of” 和 “l(fā)ast day of”來修正短語, 來明確這個問題, 也就是可以限定好不要讓date自動“規(guī)范化”:
var_dump( date("Y-m-d", strtotime("last day of -1 month", strtotime("2020-03-31"))) ); // 輸出2020-02-28
var_dump( date("Y-m-d", strtotime("first day of +1 month", strtotime("2020-08-31"))) ); // 輸出2020-09-01
var_dump( date("Y-m-d", strtotime("first day of next month", strtotime("2020-01-31"))) ); // 輸出2020-02-01
var_dump( date("Y-m-d", strtotime("last day of last month", strtotime("2020-03-31"))) ); // 輸出2020-02-28
那如果是5.3之前的版本, 可以使用mktime之類的, 把所有的日子忽略掉, 比如都限定為每月1號就可以了, 只不過就不如直接用first day來的更加優(yōu)雅.
CopyRight ? 西安宏博網(wǎng)絡(luò)科技有限公司 備案號:陜ICP備10007014號-8 站點地圖 免責(zé)聲明:本網(wǎng)站部分資源來源于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系我們告知刪除,我們將會盡快處理,謝謝!本站不承擔(dān)任何法律責(zé)任。