php 要比較某日期是否在兩個日期之間不使用DATETIME class(php >5.3)、也不轉換timestamp,如果日期字串都要相同格式的話可用字串比對。
strcmp(字串1, 字串2)
strcmp("2019-01-01", "2019-01-03")=-2 第一個字串小傳回負值
strcmp("2019-02-05", "2019-01-01")=10 第一個字串大傳回正值
strcmp("2019-01-05", "2019-01-05")=0 日期相同傳回0
所以只要符合,要比對的日期大於等於開始日期,小於等於結束日期即可知道介於開始和結束日期之間
$begin="2018-12-21"; $end= "2019-02-01"; $curr= date("Y-m-d"); // 假設取得今天日期 2019-01-03 if( strcmp($curr, $begin) >=0 && strcmp($curr, $end) <=0 ) print "日期{$curr}介於開始日期{$begin}和結束日期{$end}之間";
strcmp的漏洞
strcmp的函式比較兩個字串結果正確,但是如果參數代入的不是「字串」而是其他類型,出來的結果會無法預期產生漏洞。
因此使用 strcmp來比對,一定要確定參數一定要是「字串」
if(gettype($value) != "string"){ die "日期格式不正確"; }
再使用正規表達式來確定格式正確
if( !preg_match('/\d{4}-\d{2}-\d{2}/', $curr)){ die "日期格式不正確"; }
結論
用strcmp是比較懶的作法,但加上格式的檢查,感覺好像更麻煩。
所以適用於不需要格式檢查的判斷,例如資料庫取回的日期欄位。
還是用 strtotime來作轉換比較正確。
$begin="2018-12-21"; $end= "2019-02-01"; $curr= date("Y-m-d"); // 假設取得今天日期 2019-01-03 $begint =strtotime($begin); $endt= strtotime($end)+86400; $currt= strtotime($curr); if( $currt>= $begint && $currt <= $endt ) print "日期{$curr}介於開始日期{$begin}和結束日期{$end}之間";
要注意的是結束日期要加上86400秒,否則會以當天的一開始作結束。
重寫自原文 2010-01-08 00:27:48