You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:07:45