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

PHP中date_diff计算DateTime分钟差无法保留符号的问题

问题原因与解决方法

你忽略了DateInterval对象的invert属性——这个属性才是标记差值正负的关键。date_diff返回的days、h、i等属性本身都是绝对值,不会体现符号,而invert属性会在第二个DateTime对象早于第一个时被设为1,否则为0。

修正后的代码

$now = new DateTime('now');
$later = new DateTime('+15 minutes');
$before = new DateTime('-15 minutes');

// 计算与15分钟后的差值
$interval = date_diff($now, $later);
$interval_minutes = ($interval->days * 24 * 60) + ($interval->h * 60) + $interval->i;
if ($interval->invert) {
    $interval_minutes = -$interval_minutes;
}
echo 'Later: ' . $interval_minutes . PHP_EOL;

// 计算与15分钟前的差值
$interval = date_diff($now, $before);
$interval_minutes = ($interval->days * 24 * 60) + ($interval->h * 60) + $interval->i;
if ($interval->invert) {
    $interval_minutes = -$interval_minutes;
}
echo 'Before: ' . $interval_minutes . PHP_EOL;

更简洁的替代方案

也可以直接将DateTime对象转为时间戳后相减,再除以60得到带符号的分钟差,无需处理DateInterval的属性:

$now = new DateTime('now');
$later = new DateTime('+15 minutes');
$before = new DateTime('-15 minutes');

$later_minutes = ($later->getTimestamp() - $now->getTimestamp()) / 60;
$before_minutes = ($before->getTimestamp() - $now->getTimestamp()) / 60;

echo 'Later: ' . $later_minutes . PHP_EOL;
echo 'Before: ' . $before_minutes . PHP_EOL;

内容的提问来源于stack exchange,提问作者Álvaro Franz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:05:31