PHP7.4下DateInterval传入2376000秒返回结果少1小时问题
问题原因
这是PHP 7.4及更早版本的DateInterval已知内核缺陷:构造函数解析以秒为单位的长时长参数时,内部将总秒数转换为日、时、分的可视化字段的逻辑存在整数运算错误,才会出现总秒数正确但拆分出的小时数少1的问题。
你可以注意到返回的DateInterval对象中s属性存储的总秒数依然是正确的2376000,该偏差仅影响d、h、i这类拆分字段的显示,不会对实际日期加减运算的结果产生影响。
可行解决方案
- 方案1:升级PHP版本到8.0及以上,该版本已经修复了这个解析bug,相同的输入会正确返回
+27d 12:00:00.0的间隔结果。 - 方案2:如果无法升级PHP版本,避免直接依赖
DateInterval的d、h、i拆分字段做时长计算,直接使用自带的s属性计算准确时长,比如获取总小时数可以用$totalHours = $interval->s / 3600。 - 方案3:构造
DateInterval前提前将大秒数手动拆分为日、时、分、秒单位,再组装为间隔规范字符串,比如2376000秒对应27天12小时,就写为:
即可得到正确的拆分字段值。$interval = new DateInterval('P27DT12H'); - 方案4:通过两个时间戳的差值生成
DateInterval,避免直接解析大秒数字符串:
该方式生成的间隔对象拆分字段完全正确,不存在偏差问题。$start = new DateTime('@0'); $end = new DateTime('@2376000'); $interval = $start->diff($end);
内容的提问来源于stack exchange,提问作者Filip Kaszczyński
相关产品推荐
相关产品推荐

