PHP:判断时间差最大区间并极简显示剩余时间
如何根据时间差动态显示最简剩余时间(仅展示非零单位)
需求核心:计算当前时间与目标时间的差值后,根据差值所在区间,仅保留必要的非零时间单位进行展示,比如不足1小时只显示分钟、1天内显示小时+分钟,以此类推。
PHP 实现方案
以下是贴合需求的代码实现,同时修正了原示例中的变量名错误:
<?php $now = new DateTime('now'); // 示例:设置过期时间为3周后 $expire_on = (new DateTime())->modify('+3 weeks'); $time_left = $now->diff($expire_on); // 收集所有非零的时间单位(从大到小排序) $parts = []; if ($time_left->y > 0) { $parts[] = $time_left->y . '年'; } if ($time_left->m > 0) { $parts[] = $time_left->m . '月'; } // 将天数转换为周+剩余天数 if ($time_left->d >= 7) { $weeks = floor($time_left->d / 7); $parts[] = $weeks . '周'; $time_left->d = $time_left->d % 7; } if ($time_left->d > 0) { $parts[] = $time_left->d . '天'; } if ($time_left->h > 0) { $parts[] = $time_left->h . '小时'; } if ($time_left->i > 0) { $parts[] = $time_left->i . '分钟'; } // 根据区间筛选需要展示的层级(完全匹配伪逻辑) $display_parts = []; // 按实际日历属性判断区间,比按秒数更精准 if ($time_left->y == 0 && $time_left->m == 0 && $time_left->d == 0 && $time_left->h == 0) { // 不足1小时:仅显示分钟 $display_parts = array_slice($parts, -1); } elseif ($time_left->y == 0 && $time_left->m == 0 && $time_left->d == 0) { // 不足1天:显示小时+分钟 $display_parts = array_slice($parts, -2); } elseif ($time_left->y == 0 && $time_left->m == 0 && $time_left->d < 7) { // 不足1周:显示天+小时+分钟 $display_parts = array_slice($parts, -3); } elseif ($time_left->y == 0 && $time_left->m == 0) { // 不足1个月:显示周+天+小时+分钟 $display_parts = array_slice($parts, -4); } elseif ($time_left->y == 0) { // 不足1年:显示所有非零的月、周、天、小时、分钟 $display_parts = $parts; } // 输出最终结果 echo '剩余' . implode('', $display_parts); ?>
逻辑说明
- 时间差拆分:通过
DateTime::diff()获取DateInterval对象,提取年、月、日等非零单位,同时将天数转换为周+剩余天数,符合需求中的区间定义。 - 区间判断:直接基于
DateInterval的属性判断区间,避免了按平均天数/秒数计算的误差(比如不同月份天数差异、闰年影响)。 - 最简展示:根据区间截取对应层级的非零单位,确保只显示必要信息,不会出现带零值的冗余内容。
内容的提问来源于stack exchange,提问作者user1455083
相关产品推荐
相关产品推荐

