🔥 PHP到期日期计算避坑指南


用户1月开通一个月会员,不管哪一天开,都该2月到期,对吧?
直接用PHP的 `+1 month` 不就完事了?
strtotime(\'+1 month\');
比如 2025-01-01,输出 `2025-02-01` ✅ 完美!
当我把测试日期换成2025-01-31时
结果输出: 2025-03-03
原来,PHP的 `+1 month` 它不是智能按月份走的 它其实加了31天
1月31号 + 31天 = 2月31号
但2月没有31号 PHP觉得“不合理”,就“顺延”到了3月3号
💡 如何优雅得到过期时间?
✨2种方法✨
function getExpiry($t, $month)
{
$origDay = date(\'d\', $t);
$nextT = strtotime(\"+$month month\", $t);
$newDay = date(\'d\', $nextT);
if ($newDay != $origDay) {
$nextT = strtotime(\'last day of this month\', $nextT);
}
return date(\'Y-m-d\', $nextT);
}
(推荐🌟)
function getExpiry($t, $month)
{
$date = new \\DateTime();
$date->setTimestamp($t);
$origDay = (int)$date->format(\'d\');
$expiry = clone $date;
$expiry->modify(\"+$month month\");
$newDay = (int)$expiry->format(\'d\');
if ($newDay !== $origDay) {
$expiry->modify(\'last day of last month\');
}
return $expiry->format(\'Y-m-d\');
}
echo getExpiry(strtotime(\'2025-01-31\'), 1); // 输出: 2025-02-28 ✅
✅ 总结
`+1 month` ≠ 自然月 它是简单粗暴的日期加天数
月底是关键场景 31号遇短月必翻车
核心逻辑是“保日”失败则“保末”
#php开发 #程序员的日常 #避坑指南 #时间处理