PHP日期月份递增问题:无法正确获取每月月末日期,求解决方案
解决PHP月份递增无法正确获取月末日期的问题
问题根源在于DateTime的月份递增逻辑:当原日期是某月最后一天,但目标月份没有该日期时,会自动顺延到下一个月的第一天。比如2022-10-31加1个月,11月没有31号,就会被自动调整为2022-12-01,这就是你得到错误结果的原因。
下面提供两种可靠的解决方案:
方案一:直接定位目标月份的最后一天
使用last day of修饰符,直接指定要获取的月份的最后一天,彻底避免日期顺延问题:
$debut_paie = '2022-10-31'; // 循环5次生成预期的5个日期(原代码<=5会生成6个,不符合需求) for ($i = 0; $i < 5; $i++) : $date = new DateTime($debut_paie); // 直接定位到目标月份的最后一天 $date->modify("last day of +{$i} month"); $debut_paye = $date->format('Y-m-d'); // 注意:改用参数绑定避免SQL注入风险,不要直接拼接字符串 $sql_insert = "INSERT INTO echeance_details VALUES('', ?, ?, ?, ?, 0)"; $insert = $conn->prepare($sql_insert); $insert->execute([$id_cl, $debut_paie, $debut_paye, $montant_par_mois]); endfor;
方案二:先定位当月第一天再计算
先将初始日期调整为当月第一天,再加指定月份后,再取目标月份的最后一天,同样能规避日期顺延问题:
$debut_paie = '2022-10-31'; // 先将基准日期转到当月第一天 $baseDate = new DateTime($debut_paie); $baseDate->modify('first day of this month'); for ($i = 0; $i < 5; $i++) : // 克隆基准日期避免修改原对象 $date = clone $baseDate; $date->modify("+{$i} month"); $date->modify('last day of this month'); $debut_paye = $date->format('Y-m-d'); // 参数绑定执行SQL $sql_insert = "INSERT INTO echeance_details VALUES('', ?, ?, ?, ?, 0)"; $insert = $conn->prepare($sql_insert); $insert->execute([$id_cl, $debut_paie, $debut_paye, $montant_par_mois]); endfor;
两种方案都能输出你预期的结果:
2022-10-31 2022-11-30 2022-12-31 2023-01-31 2023-02-28
内容的提问来源于stack exchange,提问作者msi
相关产品推荐
相关产品推荐

