PHP中如何在月末日期基础上添加指定天数计算到期日?
修复到期日计算的代码问题
我来帮你排查下问题所在,你的代码里有几个关键错误导致了奇怪的1970日期输出,咱们一步步修复:
问题分析
- 变量名笔误:你定义的是
$days = 7,但代码中写的是+$day days,$day是未定义变量,strtotime()遇到这个会返回false,而date()处理false时会默认使用Unix时间戳0,也就是1970年1月1日,这就是错误输出的根源。 - 逻辑错误:在
else分支里,你先计算了月末日期赋值给$dueDate,但紧接着又用原$date重新计算覆盖了它,完全没用到之前的月末日期,根本没实现“月末加指定天数”的规则。 - 日期解析隐患:
strtotime()对DD/MM/YYYY格式的日期解析不稳定,它默认会把11/05/2018当成11月5日而非5月11日,导致后续计算全错。
修复后的代码
推荐使用PHP的DateTime类来处理日期,它更清晰可靠,能避免日期格式解析的问题:
$invoice_date = "11/05/2018"; $days = 7; $is_invoice = false; // 明确按DD/MM/YYYY格式解析日期,避免解析混淆 $date = DateTime::createFromFormat('d/m/Y', $invoice_date); if ($is_invoice) { // 发票场景:原日期加指定天数(修正变量名错误) $dueDate = $date->add(new DateInterval("P{$days}D"))->format('d/m/Y'); } else { // 非发票场景:先取当月最后一天,再加指定天数 // 克隆原日期对象,避免修改原日期数据 $lastDayOfMonth = (clone $date)->modify('last day of this month'); $dueDate = $lastDayOfMonth->add(new DateInterval("P{$days}D"))->format('d/m/Y'); } echo "Due date: $dueDate";
代码说明
DateTime::createFromFormat('d/m/Y', $invoice_date):明确指定日期格式为日/月/年,确保解析出正确的日期(5月11日)。- 非发票分支中,先克隆原日期对象再修改,防止原日期被意外改动;通过
modify('last day of this month')精准获取当月月末日期,之后再添加指定天数。 - 变量名统一使用
$days,彻底避免笔误问题。
运行这段代码后,输出结果就是你期望的:Due date: 07/06/2018
内容的提问来源于stack exchange,提问作者Philanthropist
相关产品推荐
相关产品推荐

