[精讚] [會員登入]
1859

使用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] 使用FTP PHP 上使用 FTP 的寫法

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

[PHP] 台灣身分證號及檢查程式 台灣身分證號及PHP檢查程式

PHP 移除陣列中的元素 要移除陣列中的其中一項元素

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

[PHP7] 讀取mysql資料庫的傳統方法 使用傳統預設的方法來連結mysql資料庫

隨機好文

TFTP Server 安裝及使用 讓設備的網路設定檔或是韌體經由TFTP拷備出來,操作的方法

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

[大型機台] 熱血高校躲避球 多少少年時光歲月耗在這個遊戲上,二十幾年前的那個時光,唯一想做的事就是把吃飯錢省下來拿去打一場五塊錢的電動,就算是沒錢也

此一時彼一時 我是不是易怒的人,其實我也不知道,總之我常會失控,不知道自己在幹嘛。這近生活過得浮浮的,不是很踏實,總會想太多,我甚至會

讓radio box 或checkbox 好按 在行動裝置下,radio box及checkbox變得很難按得到