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

PHP 友好時間顯示函數實現:從「幾秒前」到「年月日」的智能格式化

     編輯:PHP 綜合知識

微博、QQ 空間等社交應用常見的「剛剛」、「5 分鐘前」、「昨天 14:30」等友好時間格式,能顯著提升用戶體驗。本文提供一個功能完整、邏輯清晰的 PHP 實現函數。

一、顯示邏輯規則

時間跨度顯示格式示例
跨年且 > 3 天完整日期2023-12-25
今天 < 1 分鐘秒前30 秒前
今天 1-60 分鐘分鐘前15 分鐘前
今天 > 1 小時小時前3 小時前
昨天昨天 HH:MM昨天 14:30
前天前天 HH:MM前天 09:15
3-365 天(未跨年)月日05 月 20 號

二、核心實現代碼

<?php
/**
 * 格式化友好時間顯示
 * @param int $time Unix 時間戳
 * @return string
 */
function formatTime($time) {
    $now = time();
    $day = date('Y-m-d', $time);
    $today = date('Y-m-d');

    $dayArr = explode('-', $day);
    $todayArr = explode('-', $today);

    // 粗略天數差(30 天內準確,跨月可能有 1 天誤差)
    $days = ($todayArr[0] - $dayArr[0]) * 365
          + ($todayArr[1] - $dayArr[1]) * 30
          + ($todayArr[2] - $dayArr[2]);

    $secs = $now - $time; // 秒數差

    // 跨年且超過 3 天
    if ($todayArr[0] - $dayArr[0] > 0 && $days > 3) {
        return date('Y-m-d', $time);
    }

    // 同一年內
    if ($days < 1) { // 今天
        if ($secs < 60) return $secs . '秒前';
        elseif ($secs < 3600) return floor($secs / 60) . '分鐘前';
        else return floor($secs / 3600) . '小時前';
    } elseif ($days < 2) { // 昨天
        return '昨天' . date('H:i', $time);
    } elseif ($days < 3) { // 前天
        return '前天' . date('H:i', $time);
    } else { // 3 天前(未跨年)
        return date('m月d日', $time);
    }
}

// 測試
echo formatTime(time() - 30) . "\n";       // 30秒前
echo formatTime(time() - 3600) . "\n";     // 1小時前
echo formatTime(time() - 86400) . "\n";    // 昨天...
echo formatTime(time() - 86400 * 10) . "\n"; // 10天前...
?>

三、改進版:精確天數計算(推薦生產環境)

<?php
function formatTimePrecise($time) {
    $now = time();
    $todayStart = strtotime(date('Y-m-d'));
    $targetStart = strtotime(date('Y-m-d', $time));
    $days = ($todayStart - $targetStart) / 86400; // 精確天數
    $secs = $now - $time;

    if ($days >= 365 || ($days > 3 && date('Y', $time) != date('Y'))) {
        return date('Y-m-d', $time);
    }

    if ($days < 1) {
        if ($secs < 60) return $secs . '秒前';
        if ($secs < 3600) return floor($secs / 60) . '分鐘前';
        return floor($secs / 3600) . '小時前';
    }
    if ($days < 2) return '昨天 ' . date('H:i', $time);
    if ($days < 3) return '前天 ' . date('H:i', $time);
    return date('m月d日', $time);
}
?>

四、前端配合方案(更佳體驗)

後端返回標準 ISO 8601 時間(2024-01-15T14:30:00+08:00),前端使用 Day.js 或 Moment.js 實現:

// Day.js 示例
dayjs.extend(relativeTime);
dayjs('2024-01-15T14:30:00+08:00').fromNow(); // "2 小時前"

優勢:自動適應用戶語言、時區、實時更新無需輪詢。

五、常見坑點提醒

  • 時區一致性:服務器、數據庫、PHP 時區必須統一(date_default_timezone_set('Asia/Shanghai'))
  • 緩存衝突:全頁靜態緩存會導致友好時間固化,需採用 ESI、AJAX 或前端渲染
  • 未來時間:增加 $secs < 0 判斷,返回「剛剛」或拋出異常

靈活選擇後端或前端實現,讓時間顯示更貼近用戶直覺。

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