HOWTO · PHP

如何在 PHP 中獲取時間差的分鐘數

本文介紹瞭如何在 PHP 中獲取時間差的分鐘數,包括 date_diff()函式和數學公式。它包括 date_diff()函式和數學公式。

本頁內容

若要以分鐘計算兩個 PHP 日期時間值之間經過的時間,請相減兩者的 Unix 時間戳,再將秒數除以 60。需要計算經過時間時,請使用這種方式;需要日曆時間間隔時,請使用 date_diff();輸入是可解析的字串時,則可使用 strtotime()。兩個值應使用相同的時區脈絡,並依需求決定是否保留差值的正負方向,或只取絕對值。

從時間戳計算經過的分鐘數

DateTimeImmutable 可明確表示輸入值,而且計算時不會改動任一值。請為兩個值都設定時區;此例使用 UTC。相減時間戳會得到帶正負號的經過秒數,因此結束時間較晚時結果為正,正負方向也會隨相減順序而定。只有在不需要方向資訊時,才將差值傳入 abs()。除以 60 可保留小數分鐘;只有應用程式需要整數分鐘時,才使用四捨五入函式。

請執行此範例。程式碼維持原樣,因此輸出中的 Elapsed minutes: 標籤仍為英文。

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-16 10:00:00', $timezone);

$elapsedMinutes = ($end->getTimestamp() - $start->getTimestamp()) / 60;
echo "Elapsed minutes: $elapsedMinutes\n";

若要計算跨越日光節約時間變更的實際經過時間,請使用依預期時區建立的日期時間值所取得的時間戳。在採用日光節約時間的時區中,不要假設每個日曆日都恰好有 1,440 分鐘的實際經過時間。

使用 date_diff() 計算日曆日期差異

date_diff()(也可透過 $start->diff($end) 使用)會回傳 DateInterval,而非單一的經過分鐘總數。當問題是以日曆時間描述,例如「相差幾天、幾小時和幾分鐘?」時,間隔中的日、時和分元件就很實用。若結束時間早於開始時間,間隔的 invert 屬性會表示方向;absolute 引數則可省略方向資訊。程式碼維持原樣,因此範例輸出中的英文單位文字也會維持英文。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-18 12:30:00', $timezone);

$interval = date_diff($start, $end);
echo $interval->format('%R%a days, %h hours, and %i minutes');

對於日曆時間間隔,可以用 $interval->days * 1440 + $interval->h * 60 + $interval->i,根據各元件計算名目上的分鐘數。此算法會合併日曆日與時鐘元件;若要計算跨越時區轉換的精確經過分鐘數,它不能取代時間戳相減。若方向很重要,請保留間隔的正負方向,或使用 $interval->invert 將方向套用到計算出的數值上。

使用 strtotime() 解析時間字串

strtotime() 會將可解析的日期時間字串轉成 Unix 時間戳。只有時間的字串會依據日期脈絡解讀,因此,如果兩個值可能跨過午夜或屬於不同日期,請提供完整日期。請明確設定預設時區(或在每個字串中附上時區),確保兩個時間戳都使用預期的時區脈絡。下方的相減會保留結果的正負方向;若要取得不帶方向的經過時間,請使用 abs()。程式碼維持原樣,因此輸出中的 Elapsed minutes: 標籤仍為英文。

<?php
date_default_timezone_set('UTC');
$start = strtotime('2024-06-16 23:30:00 UTC');
$end = strtotime('2024-06-17 00:15:00 UTC');

$minutes = ($end - $start) / 60;
echo "Elapsed minutes: $minutes\n";

解析不受信任或格式不固定的輸入時,請在相減前確認每次呼叫都有回傳時間戳;解析可能失敗並回傳 false。若應用程式資料需要明確處理時區,建議使用指定時區建立 DateTimeImmutable 值。需要簡潔解析時使用 strtotime();需要計算經過時間時相減時間戳;需要描述日曆時間間隔本身時,則使用 date_diff()。