PHP中直接相减日期计算年龄触发非数值警告的解决方法
报错原因
date("Y-m-d")生成的当前日期、$_POST接收到的出生日期都是YYYY-MM-DD格式的字符串(例如2024-05-20),这类带横杠分隔的字符串不属于合法数值类型,PHP在执行减法运算时无法将其转换为有效数值,就会抛出"A non-numeric value encountered"警告,且直接相减得到的结果完全不符合年龄计算逻辑。
修复方案
使用PHP内置的DateTime类做日期差值计算,能自动处理日期格式解析、生日未到的年龄计算边界问题,运行时不会触发警告,代码如下:
// 接收用户传入的出生日期,先做合法性校验避免非法输入导致后续报错 $bday = $_POST['bday']; $birthObj = DateTime::createFromFormat('Y-m-d', $bday); if (!$birthObj) { // 可替换为自身业务对应的错误提示逻辑 exit("出生日期格式不合法,请传入YYYY-MM-DD格式的日期"); } $todayObj = new DateTime(); $dateDiff = $todayObj->diff($birthObj); $myage = $dateDiff->y; // 该值为两个日期之间的完整整年差,即为计算得到的准确年龄
常见踩坑点
- 直接对
YYYY-MM-DD格式的字符串做加减等算术运算,不仅会触发非数值类型警告,运算结果完全不具备日期计算意义 - 手动拆分字符串取年份值直接相减,会忽略月份、日期维度的差值,遇到当年生日还未到的场景,会把年龄多算1岁,
DateTime::diff()方法会自动处理这类边界问题,计算结果更可靠
内容的提问来源于stack exchange,提问作者adkffsgfds
相关产品推荐
相关产品推荐

