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

PHP7.2公历转伊斯兰回历出现非数值警告的修复咨询

解决PHP7.2下公历转伊斯兰回历的"non-numeric value encountered"警告

这个警告的核心原因是PHP7.0+对变量类型的检查变得更严格,而PHP5会自动隐式将字符串形式的数字转换为数值类型参与运算,不会抛出警告。你的代码里从explode拆分出来的日期值都是字符串类型,在PHP7.2中直接参与数学运算就会触发这个警告。

具体修复步骤

1. 强制转换日期拆分后的变量为整数类型

在拆分日期后,立刻将$day、$month、$year转为整数,这是最根本的修复:

1510 $date = "25/1/1999";
1511 $Gdate = explode ('/', $date) ;
1512 $day = (int)$Gdate[0]; // 强制转为整数
1513 $month = (int)$Gdate[1];
1514 $year = (int)$Gdate[2];

之前你尝试的intval无效,大概率是只转换了部分变量,或者转换时机不对——在变量初始化时就完成类型转换,能避免后续所有运算的类型问题。

2. 优化整数除法逻辑(可选但推荐)

PHP7+新增了intdiv函数,专门用于整数除法,比floor($x/100.)更直观且避免float类型的潜在问题:

// 替换第1524行
1524 $c = intdiv($y, 100);

// 替换第1527行的floor($c/4.)
1527 if($y>1582) {$jgc=2-$c+intdiv($c,4);}

3. 确保所有运算变量为数值类型

经过上面的修改后,第1529行的$jd计算中,所有参与运算的变量($y、$m、$day、$jgc)都会是整数或合法的数值类型,警告自然会消失。

修改后的完整核心代码片段

1510 $date = "25/1/1999";
1511 $Gdate = explode ('/', $date) ;
1512 $day = (int)$Gdate[0];
1513 $month = (int)$Gdate[1];
1514 $year = (int)$Gdate[2];
1516 $jgc=0;
1517 $m=$month;
1518 $y=$year;
1519 if($m<3)
1520 {
1521 $m=$m+12;
1522 $y=$y-1;
1523 }
1524 $c = intdiv($y, 100);
1526 if($y==1582 && $m>10) {$jgc=10;}
1527 if($y>1582) {$jgc=2-$c+intdiv($c,4);}
1529 $jd= floor(365.25*($y+4716))+floor(30.6001*($m+1))+$day+$jgc-1524;

为什么这个方案有效?

PHP7.2不再容忍字符串与数值的隐式混合运算,明确变量类型后,所有数学操作都在合法的数值类型间进行,既消除了警告,也让代码的类型逻辑更清晰,符合PHP现代版本的编码规范。

内容的提问来源于stack exchange,提问作者Quest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:07:59