在 Web 開發中,將精確的日期時間轉換為人類易讀的「幾分鐘前」、「3 天前」等相對時間格式,能顯著提升用戶體驗。本文介紹一個基於 PHP DateTime 類的 friendly_date() 函數,支援自定義精度,代碼簡潔高效。
/**
* 友好日期時間顯示
*
* @param DateTime|int $datetime 日期時間對象或時間戳
* @param int $size 顯示精度(保留幾個時間單位)
* @throws InvalidArgumentException
* @return string 格式化後的友好時間字符串
*/
function friendly_date($datetime, $size = 1) {
// 支援傳入時間戳自動轉換
if (is_int($datetime)) {
$datetime = new \DateTime("@$datetime");
}
// 參數驗證
if (!($datetime instanceof \DateTime)) {
throw new \InvalidArgumentException('參數必須是 DateTime 對象或時間戳');
}
$now = new \DateTime();
$interval = $now->diff($datetime);
// 時間單位數據與對應中文標籤
$intervalData = [
$interval->y, $interval->m, $interval->d,
$interval->h, $interval->i, $interval->s,
];
$intervalFormat = ['年', '個月', '天', '小時', '分鐘', '秒'];
// 過濾零值單位並拼接單位標籤
foreach ($intervalData as $index => $value) {
if ($value > 0) {
$intervalData[$index] = $value . $intervalFormat[$index];
} else {
unset($intervalData[$index]);
}
}
// 按精度截取並返回
return implode('', array_slice($intervalData, 0, $size));
}
// 示例 1:基本用法
$dt = new DateTime('-3 days 5 hours 30 minutes');
echo friendly_date($dt); // 輸出:3天
echo friendly_date($dt, 2); // 輸出:3天5小時
echo friendly_date($dt, 3); // 輸出:3天5小時30分鐘
// 示例 2:傳入時間戳
echo friendly_date(strtotime('-2 years 4 months')); // 輸出:2年
DateTime 對象與 Unix 時間戳雙重輸入$size 參數決定顯示幾個時間單位(預設 1)InvalidArgumentException,便於調試適用於文章發布時間、評論時間、動態流時間等需要相對時間顯示的場景。配合前端 JavaScript 定時刷新,可實現「剛剛」、「1 分鐘前」等實時更新效果。
該函數基於 DateTime::diff() 計算差值,要求 PHP 5.3+ 版本。若需支援「未來時間」(如倒計時),可擴展判斷 $interval->invert 屬性並添加「剩餘」前綴。