將 DateTime 對象轉換為「X 年前」「3 天前」「剛剛」等人類可讀的相對時間格式,提升用戶體驗。
<?php
/**
* 友好日期時間
* @param DateTime|int $datetime 日期時間對象或時間戳
* @param int $size 精確到位數(預設 1)
* @throws InvalidArgumentException
* @return string
*/
function friendly_date($datetime, $size = 1) {
if (is_int($datetime)) {
$datetime = new DateTime('@' . $datetime); // 時間戳需加 @ 前綴
}
if (!($datetime instanceof DateTime)) {
throw new InvalidArgumentException('invalid "DateTime" object');
}
$now = new DateTime();
$interval = $now->diff($datetime);
$intervalData = array(
$interval->y, $interval->m, $interval->d,
$interval->h, $interval->i, $interval->s,
);
$intervalFormat = array('年', '個月', '天', '小時', '分', '秒');
foreach ($intervalData as $index => $value) {
if ($value) {
$intervalData[$index] = $value . $intervalFormat[$index];
} else {
unset($intervalData[$index]);
unset($intervalFormat[$index]);
}
}
return implode('', array_slice($intervalData, 0, $size));
}
?>
<?php
echo friendly_date(new DateTime('-2 years 3 months')); // 2年3個月
echo friendly_date(new DateTime('-5 days 10 hours'), 2); // 5天10小時
echo friendly_date(time() - 3600); // 1小時
?>
DateTime::diff() 獲取 DateInterval 對象$size 控制輸出精度(如 1 僅顯示最大單位,2 顯示前兩個)DateTime 對象與時間戳雙重輸入此函數適用于動態信息流、評論時間、日誌記錄等場景,代碼簡潔且易於擴展(如添加「剛剛」「幾秒前」等細粒度描述)。