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

PHP 日期時間格式化完全指南:time、date、gmdate 與相對時間顯示

     編輯:PHP 相關知識

基礎時間戳

$now = time(); // 當前 Unix 時間戳 (秒)
echo "時間戳: $now\n";
echo "格式化: " . date('Y-m-d H:i:s', $now) . "\n";

// 一周後
$nextWeek = $now + 7 * 86400;
echo "下周: " . date('Y-m-d D', $nextWeek) . "\n";

date() vs gmdate() 與時區

  • date() 使用 date.timezone 設置的時區(預設 UTC)。
  • gmdate() 永遠返回 GMT/UTC 時間。
  • 最佳做法: 在 php.ini 設定 date.timezone = Asia/Taipei (或 Asia/Shanghai),統一使用 date()。
// 手動指定時區 (臨時)
date_default_timezone_set('Asia/Taipei');
echo date('Y-m-d H:i:s'); // 正確的本地時間

// 儲存時間戳到資料庫 (INT UNSIGNED)
// 顯示時按用戶時區轉換
function showTime($timestamp, $userTz = 'Asia/Taipei') {
    $dt = new DateTime("@$timestamp"); // UTC
    $dt->setTimezone(new DateTimeZone($userTz));
    return $dt->format('Y-m-d H:i:s');
}

常用格式化字符對照表

字符說明範例
Y4 位年份2024
m月份 (01-12)03
d日期 (01-31)15
H24 小時 (00-23)14
i分鐘 (00-59)30
s秒 (00-59)05
D星期幾 (Mon-Sun)Mon
w星期數 (0=Sun)1
z年間第幾天74
W年間第幾周11

相對時間顯示函數 (如「3分鐘前」、「今天 14:30」)

/**
 * 友好相對時間
 * @param int $timestamp 發布時間戳
 * @param int $now 當前時間戳 (可選,用於測試)
 * @return string
 */
function relativeTime($timestamp, $now = 0) {
    if (!$now) $now = time();
    $diff = $now - $timestamp;

    if ($diff < 60) return $diff . '秒前';
    if ($diff < 3600) return floor($diff / 60) . '分鐘前';
    if ($diff < 86400) return floor($diff / 3600) . '小時前';

    // 今天 / 昨天 / 更早
    $todayStart = strtotime('today');
    $yesterdayStart = $todayStart - 86400;

    if ($timestamp >= $todayStart) {
        return '今天 ' . date('H:i', $timestamp);
    } elseif ($timestamp >= $yesterdayStart) {
        return '昨天 ' . date('H:i', $timestamp);
    } else {
        return date('m-d', $timestamp);
    }
}

// 測試
echo relativeTime(time() - 30) . "\n";      // 30秒前
echo relativeTime(time() - 1200) . "\n";    // 20分鐘前
echo relativeTime(time() - 7200) . "\n";    // 2小時前
echo relativeTime(strtotime('today 10:00')) . "\n"; // 今天 10:00
echo relativeTime(strtotime('yesterday 15:30')) . "\n"; // 昨天 15:30
echo relativeTime(strtotime('-5 days')) . "\n"; // 03-10

DateTime 物件導向用法 (PHP 5.2+)

$dt = new DateTime('2024-03-15 14:30:00', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s') . "\n";

// 修改時間
$dt->modify('+1 day')->modify('+2 hours');
echo $dt->format('Y-m-d H:i:s') . "\n";

// 差值計算
$dt1 = new DateTime('2024-01-01');
$dt2 = new DateTime('2024-03-15');
$interval = $dt1->diff($dt2);
echo "相差 {$interval->y}年 {$interval->m}月 {$interval->d}天\n";
echo "總天數: {$interval->days}\n";

常見陷阱提醒

  • strtotime('+1 month') 在 1 月 31 日會變 3 月 3 日 (因 2 月無 31 號),建議用 modify('first day of +1 month')。
  • date('W') 遵循 ISO-8601 週數 (週一為週首),可能與業務週定義不同。
  • 資料庫儲存 TIMESTAMP 會自動按服務器時區轉換,DATETIME 不轉換;建議統一存 INT 時間戳或 DATETIME 配合應用層時區處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved