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

PHP字符串转整数异常求助:转换结果不符预期

问题解决&原因分析

更可靠的实现方式

完全不用自己写判断截取逻辑,PHP有更简洁高效的方法处理这种时间字符串:

  1. 直接转整数:PHP会自动提取字符串开头的数字部分,直接转换即可满足需求:
$startTimeNumber = (int)$meetings["dtStartZeit"];

比如"08:00:00"转int后为8,"14:30:00"转后为14,完全符合预期。

  1. 分割字符串取小时:用冒号分割时间字符串,取第一个元素转整数:
$timeParts = explode(':', $meetings["dtStartZeit"]);
$startTimeNumber = (int)$timeParts[0];
  1. DateTime类处理:适合需要后续进行更多时间操作的场景:
$dt = DateTime::createFromFormat('H:i:s', $meetings["dtStartZeit"]);
$startTimeNumber = (int)$dt->format('H');

异常原因分析

你遇到的"字符串为'8'时转成9,加1后变8"这种情况非常反常,大概率不是这段代码本身的逻辑问题,可能是以下原因:

  • 变量内容不纯净:$startTimeString不是单纯的半角"8",可能混入了不可见字符(比如换行、制表符)或者是全角"8",导致转int时解析出错。可以用var_dump($startTimeString)查看变量真实内容,普通半角"8"会显示string(1) "8",如果是全角或带不可见字符,长度会有明显差异。
  • 变量名混淆/后续代码修改:你加1的可能不是$startTimeNumber,或者后续有其他代码修改了该变量的值。
  • 编码异常:数据库返回的字符串编码有问题,导致字符解析错误。

另外补充:你的原代码中strpos($meetings["dtStartZeit"], "0") == 0存在逻辑bug,应该改成strpos(...) === 0——因为strpos找不到字符时会返回false,而false == 0会被判定为真,若时间字符串中没有"0",会错误进入第一个分支截取字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:40:53