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

PHP 相對時間格式化函式 (X 分鐘前、Y 小時前、剛剛)

     編輯:PHP 綜合知識

應用場景

社群動態、留言系統、通知列表、文章發布時間等需要人性化顯示相對時間的場合。

核心函式

<?php
function relativeTime($time = false, $limit = 86400, $format = 'g:i A M jS') {
    // 1. 參數正規化
    if (empty($time) || (!is_string($time) && !is_numeric($time))) {
        $time = time();
    } elseif (is_string($time)) {
        $time = strtotime($time);
    }
    
    $now = time();
    
    // 2. 特殊情況
    if ($time === $now) return '剛剛';
    if ($time > $now) return '未來時間';
    
    // 3. 時間差計算
    $diff = $now - $time;
    
    // 超過限制顯示完整日期
    if ($diff >= $limit) return date($format, $time);
    
    // 4. 相對時間分級
    if ($diff < 60) {
        return '不到一分鐘前';
    } elseif (($minutes = ceil($diff / 60)) < 60) {
        return $minutes . ' 分鐘前';
    } else {
        $hours = ceil($diff / 3600);
        return '約 ' . $hours . ' 小時前';
    }
}

使用範例

echo relativeTime(time() - 30);           // 剛剛
echo relativeTime(time() - 90);           // 2 分鐘前
echo relativeTime(time() - 3600);         // 1 小時前
echo relativeTime(time() - 7200);         // 2 小時前
echo relativeTime(time() - 86400);        // 10:30 AM Jan 1st (超過 24h 顯示完整日期)
echo relativeTime('2023-12-25 15:30:00'); // 字串時間輸入

進階版:支援更多粒度與本地化

function relativeTimeAdvanced($time, $locale = 'zh-TW') {
    if (is_string($time)) $time = strtotime($time);
    $diff = time() - $time;
    if ($diff < 0) return '未來';
    
    $intervals = [
        'year'   => 31556926,
        'month'  => 2629744,
        'week'   => 604800,
        'day'    => 86400,
        'hour'   => 3600,
        'minute' => 60,
        'second' => 1,
    ];
    
    $labels = [
        'zh-TW' => ['year'=>'年', 'month'=>'個月', 'week'=>'週', 'day'=>'天', 'hour'=>'小時', 'minute'=>'分鐘', 'second'=>'秒'],
        'en-US' => ['year'=>'year', 'month'=>'month', 'week'=>'week', 'day'=>'day', 'hour'=>'hour', 'minute'=>'minute', 'second'=>'second'],
    ];
    $l = $labels[$locale] ?? $labels['en-US'];
    
    if ($diff < 60) return '剛剛';
    
    foreach ($intervals as $unit => $seconds) {
        $count = floor($diff / $seconds);
        if ($count >= 1) {
            return $count . $l[$unit] . '前';
        }
    }
    return '剛剛';
}

前端替代方案:timeago.js

<!-- HTML -->
<time class="timeago" datetime="2023-12-25T15:30:00+08:00">2023-12-25 15:30</time>

<!-- JS -->
<script src="https://cdn.jsdelivr.net/npm/timeago.js@4"></script>
<script>
timeago().render(document.querySelectorAll('.timeago'), 'zh_TW');
// 自動更新、支援 40+ 語言、無伺服器端運算
</script>

效能與快取策略

  • 後端計算:每次請求運算,適合低頻更新內容
  • 前端計算:一次性傳送 ISO 8601 時間,瀏覽器定時更新,零伺服器負擔
  • 混合策略:後端輸出 <time datetime="...">相對時間</time>,前端接管自動更新

時區陷阱提醒

// 確保伺服器與資料庫時區一致
date_default_timezone_set('Asia/Taipei'); // PHP
// MySQL: SET time_zone = '+08:00'; 或 my.cnf 設定 default-time-zone

// 儲存統一用 UTC,顯示時轉換用戶時區
$utcTime = new DateTime('2023-12-25 15:30:00', new DateTimeZone('UTC'));
$userTz = new DateTimeZone('Asia/Taipei');
$utcTime->setTimezone($userTz);
echo relativeTime($utcTime->getTimestamp());

相對時間格式化是提升用戶體驗的細節關鍵,選擇前端或後端實作取決於即時性需求與架構偏好。

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