PHP 将 DateTime 对象转化为友好时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 友好的时间显示
*
* size = 1, 显示1位,如: 1年、3个月、5天、20小时...
* size = 2, 显示2位,如: 1年1个月、1年3天、5天4小时、2小时25分...
* size = 3, 显示3位,如: 1年1个月4天、1年3天20小时、5天4小时3秒、2小时25分10秒...
* size = 4, 显示4位,如: 1年1个月4天16小时...
* size >= 5,显示5位,如: 1年1个月4天16小时15分钟...
*
* @param string|DateTime $datetime 日期字符串或日期 DateTime 对象
* @param int $size 精确到位数
* @param bool $absolute 正数的时间间隔
*
* @return string
*/
public static function friendlyDate($datetime, $size = 1, $absolute = false)
{
if (is_string($datetime)) {
$datetime = new DateTime($datetime);
}

if (! ($datetime instanceof DateTime)) {
throw new \InvalidArgumentException('invalid "DateTime" object');
}

$now = new DateTime();
if ($absolute && $datetime <= $now) {
return '';
}

$interval = $now->diff($datetime);

$intervalData = [
$interval->y, $interval->m, $interval->d,
$interval->h, $interval->i, $interval->s,
];
$intervalFormat = ['年', '个月', '天', '小时', '分钟', '秒'];

foreach ($intervalData as $key => $value) {
if ($value) {
$intervalData[$key] = $value . $intervalFormat[$key];
} else {
unset($intervalData[$key]);
unset($intervalFormat[$key]);
}
}

return implode('', array_slice($intervalData, 0, $size));
}