PHP实现时间格式化:7天内显时间间隔 超7天显月日跨年加年份
修改后完整代码
public function time_elapsed_string($datetime, $full = false) { $now = new DateTime; $ago = new DateTime($datetime); $diff = $now->diff($ago); // 超过7天走日期格式化逻辑 if ($diff->days > 7) { // 判断是否为当前年份 if ($ago->format('Y') === $now->format('Y')) { return $ago->format('j M'); } else { return $ago->format('j M Y'); } } // 7天及以内保留原有「多久前」逻辑 $diff->w = floor($diff->d / 7); $diff->d -= $diff->w * 7; $string = array( 'y' => 'year', 'm' => 'month', 'w' => 'week', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second', ); foreach ($string as $k => &$v) { if ($diff->$k) { $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : ''); } else { unset($string[$k]); } } if (!$full) $string = array_slice($string, 0, 1); return $string ? implode(', ', $string) . ' ago' : 'just now'; }
实现说明
- 用
DateInterval的days属性获取两个时间的总间隔天数,不受跨月、跨年影响,判断逻辑准确 - 日期格式化完全匹配需求:
- 同一年的超7天时间,输出
日期 月份简写格式,示例为5 Jan - 非本年的超7天时间,自动追加年份,示例为
5 Jan 2022
- 同一年的超7天时间,输出
- 7天及以内的展示逻辑完全保留原有实现,原有的
$full参数、多时间单位拼接规则都可正常使用 - 如果需要显示中文月份,可将格式符中的
M替换为中文月份映射,或使用IntlDateFormatter类实现本地化输出
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

