引言
在實際業務邏輯中,對時間戳,日期對象,日期字符串的處理,我們經常需要用到時間比較,還需要用到求日期差。比如對一場活動的倒計時,優惠券的過期時間等等。
今天我們介紹一下如何計算兩個日期之間的差值?
因為日期可以是字符串,對象,數值,格式各不相同,有的精確到日,有的精確到小時,有的精確到毫秒。如何在處理中做到容錯率要高呢。
學習時間
先說最笨的辦法。不藉助任何對象,我們僅使用內置的函數加減乘除和格式轉換。像下面這樣寫。(這個方法對於實施了夏令時的地區,會出現錯誤。)
$now = time(); $your_date = strtotime("2020-01-31"); $datediff = $now - $your_date; echo round($datediff / (60 * 60 * 24));
上面的方法是使用時間戳,把整數值做減法,最後除以一天的秒數,四捨五入取整,就是相差的天數。
這樣寫當然是沒有問題的。但是,如果在框架內使用,我們更提倡使用對象的操作方式對時間進行運算。
下面是 PHP 提供的內置的 DateTime 對象用於操作。
$earlier = new DateTime("2019-07-06"); $later = new DateTime("2020-07-01"); $diff = $later->diff($earlier)->format("%a");
DateTime 日期時間對象是 PHP 5.3 以上才提供的。上述代碼在求差值運算上,調用了 DateTime 的 diff 方法,並鏈式調用 format 格式化輸出。
更簡單友好:Carbon
如果你覺得使用 DataTime 對象實在是不好用,有沒有更友好的,更簡單,調用更簡單的類呢?有的,它就是Carbon庫。該庫封裝了非常多非常多日期時間操作解析的方法,足以應對各種各樣變態的需求。
計算日期天數差,簡直是小菜一碟,
$dt = Carbon::parse('2020-01-01'); echo $dt->diffInDays(Carbon::now());
第一行,把日期字符串解析成 Carbon 對象。然後對其進行求天數差的方法 diffInDays。結果就是天數。
那如果要求相差的小時數呢,diffInHours,diffInSeconds,是不是簡單好記?猜都能猜的到用途。
寫在最後
我們強烈建議,使用 DateTime 或者 Carbon 庫執行日期時間的操作,效率很高,操作方便,而且容錯率很高。
Happy coding :_)
我是 @程式設計師小助手 ,持續分享編程知識,歡迎關注。