社群動態、留言系統、通知列表、文章發布時間等需要人性化顯示相對時間的場合。
<?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 '剛剛';
}
<!-- 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>
<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());
相對時間格式化是提升用戶體驗的細節關鍵,選擇前端或後端實作取決於即時性需求與架構偏好。