如何对两个DateInterval执行减法操作?PHP间隔计算遇问题求助
解决PHP中两个DateInterval相减的问题
嘿,这个坑我之前踩过!你遇到的问题本质是**DateInterval::sub()方法根本不是用来让两个DateInterval对象直接相减的**——它的设计初衷是给一个DateTime对象减去某个时间间隔,直接用它操作两个间隔自然会失效。
先纠正一个小细节:你写的DateInterval('12:00')其实不符合PHP的DateInterval构造参数规范,正确的写法应该用ISO8601格式,比如PT12H代表12小时,PT1H30M代表1小时30分,不然构造出来的间隔可能会出错哦。
下面给你两种靠谱的解决方案:
方案一:转成秒数计算(直观易懂)
把两个时间间隔先转换成总秒数,相减后再转回DateInterval:
// 辅助函数:把DateInterval转为总秒数 function intervalToSeconds(DateInterval $interval): int { $baseDateTime = new DateTime('@0'); // 以Unix时间戳0为基准点 $baseDateTime->add($interval); return $baseDateTime->getTimestamp(); } // 初始化正确的时间间隔 $intervalFrom = new DateInterval('PT12H'); $intervalTo = new DateInterval('PT1H30M'); // 计算秒数差 $totalSeconds = intervalToSeconds($intervalFrom) - intervalToSeconds($intervalTo); // 把秒数转回DateInterval $newInterval = new DateInterval("PT{$totalSeconds}S"); // 输出你要的格式 echo $newInterval->format('%H:%I'); // 结果:10:30
方案二:借助DateTime对象间接计算(PHP原生方法)
利用DateTime的加减能力,通过基准时间间接得到两个间隔的差:
// 初始化正确的时间间隔 $intervalFrom = new DateInterval('PT12H'); $intervalTo = new DateInterval('PT1H30M'); // 创建基准时间(Unix时间戳0) $baseDate = new DateTime('@0'); // 先加上第一个间隔,得到一个时间点 $tempDate = clone $baseDate; $tempDate->add($intervalFrom); // 再减去第二个间隔 $tempDate->sub($intervalTo); // 计算基准时间和结果时间的差,就是我们要的新间隔 $newInterval = $baseDate->diff($tempDate); // 输出目标格式 echo $newInterval->format('%H:%I'); // 结果:10:30
两种方法都能得到你想要的DateInterval('10:30')(对应ISO格式是PT10H30M),你可以根据自己的代码场景选一个顺手的。
内容的提问来源于stack exchange,提问作者Taras Germanyuk From Ukraine
相关产品推荐
相关产品推荐

