php使用strtotime技巧示例解惑
引言
經常會有人被 strtotime 結合 - 1 month, +1 month, next month 的時候搞得很困惑,然后就會覺得這個函數有點不那么靠譜,動不動就出問題。用的時候就會很慌…
這不,剛剛就有人在微博上又問我:
date("Y-m-d",strtotime("-1 month"))
今天是 2018-07-31 執(zhí)行代碼,怎么輸出是 2018-07-01?
好的吧,雖然這個問題看起來很迷惑,但從內部邏輯上來說呢,其實是” 對” 的,你先別著急哈,讓我慢慢講:
我們來模擬下 date 內部的對于這種事情的處理邏輯:
先做 - 1 month, 那么當前是 07-31, 減去一以后就是 06-31.
再做日期規(guī)范化,因為 6 月沒有 31 號,所以就好像 2 點 60 等于 3 點一樣,6 月 31 就等于了 7 月 1
是不是邏輯很” 清晰” 呢?我們也可以手動驗證第二個步驟,比如:
var_dump(date("Y-m-d", strtotime("2017-06-31"))); //輸出2017-07-01
也就是說,只要涉及到大小月的最后一天,都可能會有這個迷惑,我們也可以很輕松的驗證類似的其他月份,印證這個結論:
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
那怎么辦呢?
從 PHP5.3 開始呢,date 新增了一系列修正短語,來明確這個問題,那就是”first day of” 和 “last day of”, 也就是你可以限定好不要讓 date 自動” 規(guī)范化”:
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
那如果是 5.3 之前的版本 (還有人用么?), 你可以使用 mktime 之類的,把所有的日子忽略掉,比如都限定為每月 1 號就可以了,只不過就不如直接用 first day 來的更加優(yōu)雅.
以上就是php使用strtotime技巧示例解惑的詳細內容,更多關于php strtotime解惑的資料請關注腳本之家其它相關文章!
相關文章
PHP+AJAX實現(xiàn)無刷新注冊(帶用戶名實時檢測)
PHP+AJAX實現(xiàn)無刷新注冊(帶用戶名實時檢測)...2006-12-12在Linux系統(tǒng)的服務器上隱藏PHP版本號的方法
這篇文章主要介紹了在Linux系統(tǒng)的服務器上隱藏PHP版本號的方法,有助于預防攻擊者針對PHP詳細版本的漏洞而發(fā)起的攻擊,需要的朋友可以參考下2015-06-06