如何用PHP+HTML计算并展示两个日期的天数/周数差?
日期时间差计算异常(始终显示+0 days)的修复及周+天格式实现
问题原因
你当前代码输出+0 days,大概率是因为date_create($_GET['date_started'])或date_create($_GET['date_completed'])返回了false——比如$_GET传递的日期格式不符合PHP可识别的标准(比如非YYYY-MM-DD格式),或者参数为空,导致date_diff无法正确计算两个有效DateTime对象的差值,最终返回0天的结果。
另外,你当前的代码也未实现需求中的「X周X天」格式,这里一起解决。
解决方案
步骤1:校验并获取有效日期对象
先确保从数据库取出的日期能被正确解析为DateTime对象,建议指定明确的日期格式(比如数据库存储的是YYYY-MM-DD),避免自动解析出错:
// 从数据库查询结果中取出日期(替换成你实际的查询逻辑) $dateStarted = $row['date_started']; $dateCompleted = $row['date_completed']; // 用指定格式创建DateTime对象,确保解析成功 $datetime1 = DateTime::createFromFormat('Y-m-d', $dateStarted); $datetime2 = DateTime::createFromFormat('Y-m-d', $dateCompleted); // 校验日期有效性 if (!$datetime1 || !$datetime2) { $durationText = "无效日期"; } else { // 计算总天数差(确保为正数,兼容completed早于started的情况) $interval = $datetime2->diff($datetime1); $totalDays = abs($interval->days); // 转换为周和天 $weeks = floor($totalDays / 7); $remainingDays = $totalDays % 7; // 拼接输出文本 $durationParts = []; if ($weeks > 0) { $durationParts[] = "{$weeks}周"; } if ($remainingDays > 0) { $durationParts[] = "{$remainingDays}天"; } // 处理刚好整周或整天的情况 $durationText = empty($durationParts) ? "0天" : implode('', $durationParts); }
步骤2:表格输出修正
把原来的输出代码替换为:
<td><?php echo $durationText; ?></td>
(如果用的是模板引擎,比如Smarty,就写成{$durationText})
示例验证
对于2024-07-01到2024-07-26:
- 总天数:25天
- 周数:25 ÷7 =3(取整),剩余天数:25%7=5
- 最终输出:
3周5天,完全符合需求。
内容的提问来源于stack exchange,提问作者Rxina
相关产品推荐
相关产品推荐

