[精讚] [會員登入]
2225

使用strcmp來判斷日期是否介於某日期之間

要比較現在日期是否在兩個日期之間,使用字串比對的方法

分享此文連結 //n.sfs.tw/12990

分享連結 使用strcmp來判斷日期是否介於某日期之間@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 11:42:07 最後編修
2019-01-03 16:36:53 By 張○○
 

自動目錄

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

END

你可能感興趣的文章

[PHP] 使用browscap檢查瀏覽器版本 使用PHP內建函數browscap檢查瀏覽器版本

[PHP] 字串拆解函數substr 奇異的錯誤(札記) 偶然發現一個 substr函數拆解上的怪異之處

[PHP] CodeIgniter 3+pure+smarty安裝及環境設置1/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合

[PHP] 取得檔名和路徑:basename, dirname 由絕對路徑取的路徑及檔名的方法

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

[CodeIgniter3] CI3 Session 失敗的問題 這次把我的程式放到Centos8,結果sesssion 一直沒作用,真的不知道發生了什麼事?

隨機好文

SELinux 常用指令和檔案 在Redhat系列中,Centos5以後加入了selinux,他並沒有這麼可怕,不必每次看到Selinux ,就想把他

[Freebsd] 定時測試 ADSL 是否斷線並重連 中華電信 ADSL 雖有固定 ip,可是他卻會不定時「斷線」, 使用以下的 方法可以定時測試是否斷線,以及重新撥接。

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

[Win7] 燒錄 iso 檔 在Windows7 中內建燒錄程式,可以直接把檔案拉到光碟機裡,再執行燒錄。

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。