php使用strtotime技巧示例解惑
引言
經(jīng)常會(huì)有人被 strtotime 結(jié)合 - 1 month, +1 month, next month 的時(shí)候搞得很困惑,然后就會(huì)覺(jué)得這個(gè)函數(shù)有點(diǎn)不那么靠譜,動(dòng)不動(dòng)就出問(wèn)題。用的時(shí)候就會(huì)很慌…
這不,剛剛就有人在微博上又問(wèn)我:
date("Y-m-d",strtotime("-1 month"))
今天是 2018-07-31 執(zhí)行代碼,怎么輸出是 2018-07-01?
好的吧,雖然這個(gè)問(wèn)題看起來(lái)很迷惑,但從內(nèi)部邏輯上來(lái)說(shuō)呢,其實(shí)是” 對(duì)” 的,你先別著急哈,讓我慢慢講:
我們來(lái)模擬下 date 內(nèi)部的對(duì)于這種事情的處理邏輯:
先做 - 1 month, 那么當(dāng)前是 07-31, 減去一以后就是 06-31.
再做日期規(guī)范化,因?yàn)?6 月沒(méi)有 31 號(hào),所以就好像 2 點(diǎn) 60 等于 3 點(diǎn)一樣,6 月 31 就等于了 7 月 1
是不是邏輯很” 清晰” 呢?我們也可以手動(dòng)驗(yàn)證第二個(gè)步驟,比如:
var_dump(date("Y-m-d", strtotime("2017-06-31"))); //輸出2017-07-01
也就是說(shuō),只要涉及到大小月的最后一天,都可能會(huì)有這個(gè)迷惑,我們也可以很輕松的驗(yàn)證類似的其他月份,印證這個(gè)結(jié)論:
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 開(kāi)始呢,date 新增了一系列修正短語(yǔ),來(lái)明確這個(gè)問(wèn)題,那就是”first day of” 和 “last day of”, 也就是你可以限定好不要讓 date 自動(dòng)” 規(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 號(hào)就可以了,只不過(guò)就不如直接用 first day 來(lái)的更加優(yōu)雅.
以上就是php使用strtotime技巧示例解惑的詳細(xì)內(nèi)容,更多關(guān)于php strtotime解惑的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP+AJAX實(shí)現(xiàn)無(wú)刷新注冊(cè)(帶用戶名實(shí)時(shí)檢測(cè))
PHP+AJAX實(shí)現(xiàn)無(wú)刷新注冊(cè)(帶用戶名實(shí)時(shí)檢測(cè))...2006-12-12php在頁(yè)面中調(diào)用fckeditor編輯器的方法
fckeditor編輯器的代碼可以寫成一個(gè)函數(shù)或者類別,直接調(diào)用,不用每次都要寫那么多代碼!2011-06-06PHP列出MySQL中所有數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了PHP列出MySQL中所有數(shù)據(jù)庫(kù)的方法,涉及php操作數(shù)據(jù)庫(kù)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03php自定義類fsocket模擬post或get請(qǐng)求的方法
這篇文章主要介紹了php自定義類fsocket模擬post或get請(qǐng)求的方法,涉及php使用socket模擬post及get請(qǐng)求的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07在Linux系統(tǒng)的服務(wù)器上隱藏PHP版本號(hào)的方法
這篇文章主要介紹了在Linux系統(tǒng)的服務(wù)器上隱藏PHP版本號(hào)的方法,有助于預(yù)防攻擊者針對(duì)PHP詳細(xì)版本的漏洞而發(fā)起的攻擊,需要的朋友可以參考下2015-06-06php實(shí)現(xiàn)自動(dòng)生成驗(yàn)證碼的實(shí)例講解
在本篇文章里小編給大家整理了一篇關(guān)于php實(shí)現(xiàn)自動(dòng)生成驗(yàn)證碼的實(shí)例講解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-10-10