什麼是 InteractsWithTime
Illuminate\Support\InteractsWithTime 是彙整了時間、延遲、經過時間計算的 trait。在 Laravel 框架內有超過 40 個類別 use InteractsWithTime;,於 Cache、Queue、Console、資料庫連線等廣泛的元件中使用。
原始碼位於
src/Illuminate/Support/InteractsWithTime.php。僅由 protected 方法組成,前提是由類別內部呼叫的用途。框架內的使用範例
方法解說
secondsUntil() — 取得剩餘秒數
回傳至指定日期時間或延遲值的剩餘秒數。引數可傳入 DateTimeInterface、DateInterval 或秒數整數其中之一。
0(不會為負數)。
availableAt() — 可用時的 UNIX 時間戳記
回傳於當前時刻加上延遲後的 UNIX 時間戳記。用於 Queue Job 延遲或 Cache 的有效期限計算。
0)呼叫,則回傳當前時刻的時間戳記。
parseDateInterval() — 將 DateInterval 轉為 DateTime
若接收 DateInterval 實例,會轉換為加至當前時刻的 Carbon 實例後回傳。DateTimeInterface 或整數值則原樣回傳。
secondsUntil() 與 availableAt() 內部都會呼叫此方法。
currentTime() — 當前時刻的 UNIX 時間戳記
回傳 Carbon::now()->getTimestamp() 的簡單 wrapper。用作 secondsUntil() 的基準時刻。
runTimeForHumans() — 將執行時間轉為人類易讀的格式
將以 microtime(true) 記錄的起始時刻與結束時刻的差,轉換為易讀的字串。
42.15ms 帶小數點的毫秒表示,1000ms 以上則以 CarbonInterval 的 forHumans() 短縮形式(如 1s 234ms)回傳。
亦可將結束時刻傳入第 2 個引數,以轉換已量測的區間。
套件開發的活用
Cache Driver 的 TTL 統一
當要建立put(key, value, ttl) 中 ttl 可接受 int、DateInterval、DateTime 皆可的方法時很方便。
Console 指令的處理時間顯示
於Artisan 指令的 handle() 中向使用者顯示處理時間時可以活用。
測試用的 InteractsWithTime
Illuminate\Foundation\Testing\Concerns\InteractsWithTime 為另一物,提供在測試案例中操作時間的 travel*() 方法(會自動整合至 TestCase)。
Illuminate\Support\InteractsWithTime(本頁主題)命名空間不同,請留意勿混淆。
總結
若想建立引數可接受
int、DateInterval、DateTimeInterface 任一者的方法,僅需 use 此 trait 即可省去重新實作轉換邏輯。