PHP 實作相對時間顯示
function timeAgo($last_time) {
if ($last_time > 2592000) { // 30 天
return intval($last_time / 2592000) . '個月前';
} elseif ($last_time > 604800) { // 7 天
return intval($last_time / 604800) . '個星期前';
} elseif ($last_time > 86400) { // 1 天
return intval($last_time / 86400) . '天前';
} else {
return '今天';
}
}
// 使用範例
$diff = time() - strtotime($record['created_at']);
echo timeAgo($diff); // 輸出:3天前、2個月前 等
MySQL 單純 SQL 寫法(5.7+)
SELECT
CASE
WHEN TIMESTAMPDIFF(MONTH, created_at, NOW()) >= 1
THEN CONCAT(TIMESTAMPDIFF(MONTH, created_at, NOW()), '個月前')
WHEN TIMESTAMPDIFF(WEEK, created_at, NOW()) >= 1
THEN CONCAT(TIMESTAMPDIFF(WEEK, created_at, NOW()), '週前')
WHEN TIMESTAMPDIFF(DAY, created_at, NOW()) >= 1
THEN CONCAT(TIMESTAMPDIFF(DAY, created_at, NOW()), '天前')
WHEN TIMESTAMPDIFF(HOUR, created_at, NOW()) >= 1
THEN CONCAT(TIMESTAMPDIFF(HOUR, created_at, NOW()), '小時前')
WHEN TIMESTAMPDIFF(MINUTE, created_at, NOW()) >= 1
THEN CONCAT(TIMESTAMPDIFF(MINUTE, created_at, NOW()), '分鐘前')
ELSE '剛剛'
END AS time_ago
FROM articles;
進階版:支援「未來時間」與精確秒數
function formatRelativeTime($timestamp) {
$diff = time() - $timestamp;
$absDiff = abs($diff);
$suffix = $diff > 0 ? '前' : '後';
$intervals = [
31536000 => '年',
2592000 => '個月',
604800 => '週',
86400 => '天',
3600 => '小時',
60 => '分鐘',
1 => '秒'
];
foreach ($intervals as $seconds => $unit) {
if ($absDiff >= $seconds) {
return intval($absDiff / $seconds) . $unit . $suffix;
}
}
return '剛剛';
}
提示: 資料庫儲存建議使用 TIMESTAMP 或 DATETIME 型別,避免使用 Unix 時間戳整數欄位,方便直接使用 SQL 日期函數運算。