首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 將 DateTime 對象轉換為友好時間顯示的實現代碼

     編輯:PHP 綜合知識

PHP 友好時間顯示函數實現

在 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)
  • 智能過濾零值:自動跳過值為 0 的時間單位,避免出現「0小時」等冗餘信息
  • 嚴格異常處理:非法參數拋出 InvalidArgumentException,便於調試

應用場景

適用於文章發布時間、評論時間、動態流時間等需要相對時間顯示的場景。配合前端 JavaScript 定時刷新,可實現「剛剛」、「1 分鐘前」等實時更新效果。

注意事項

該函數基於 DateTime::diff() 計算差值,要求 PHP 5.3+ 版本。若需支援「未來時間」(如倒計時),可擴展判斷 $interval->invert 屬性並添加「剩餘」前綴。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved