将 DateInterval 对象转换为秒数在 PHP 中

24
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

我该如何在PHP中将上述$interval转换为秒


请注意,分钟和小时都不是精确的时间单位。一分钟可能包含59、60或61秒,一个小时可能包含3599、3600或3601秒。将月份转换为秒完全是无意义的。 - matt
3个回答

49

获取时间间隔中的秒数的另一种方法是将其添加到零日期,并获取该日期的时间戳:

$seconds = date_create('@0')->add($interval)->getTimestamp();

这种方法将更或者更少地正确处理通过DateInterval构造函数创建的时间间隔,而shiplu的答案则会在处理这样的时间间隔时忽略年、月和日。然而,对于通过减去两个日期所创建的时间间隔,shiplu的答案更加精确。对于仅包含小时、分钟和秒的时间间隔,两种方法都可以得到正确的答案。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MaxiWheat
5
时间间隔是通过从2015年2月1日减去2015年3月1日得出的。这相差一个月,恰好等于28天。Shiplu的方法将把这个间隔视为28天的间隔,而我的方法将把它视为一个月的间隔,任意选择一月份(如1月),并基于1月份的31天产生一个时间戳。 - Brilliand

29

有一个函数format可以实现这个功能。但它不会返回秒数。要获取秒数,您需要使用以下技巧。

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp());

如果您确实想使用$interval,则需要对其进行计算。

$seconds = $interval->days*86400 + $interval->h*3600 
           + $interval->i*60 + $interval->s;

这里:

  • 86400 是一天中的秒数
  • 3600 是一小时的秒数
  • 60 是一分钟的秒数

它返回“0秒”。 - sanchitkhanna26
@MarkBaker 是的,这就是为什么我改变了我的答案。 - Shiplu Mokaddim
这仍然存在错误的可能。$interval->days 可能 是一个布尔值。替代 $interval->days,使用 $interval->y$interval->m$interval->d 会更安全。你将面临的直接问题是决定在一个月中使用多少天。@Brilliand 的答案解决了这个问题,但也有其自身的限制。要明智地选择。 - Joel Mellon

1

我只会添加到shiplu的答案:

function dateIntervalToSeconds($interval)
{
    $seconds = $interval->days*86400 + $interval->h*3600 
       + $interval->i*60 + $interval->s;
    return $interval->invert == 1 ? $seconds*(-1) : $seconds;
}

处理负时间间隔。
请注意,与Brilliand's answer相反,上述代码将正确考虑年、月和日期。因为$interval->days是绝对值($interval->d相对于月份)。
编辑:如@Brilliand所指出的,此函数仍然不正确。一个反例是
new DateInterval('P4M3DT2H'); 

它对月份的处理不好。


1
一个会失败的时间间隔示例是 new DateInterval('P4M3DT2H')。试一下,你会发现 days 变量是空的,尽管这个时间间隔大约跨越了 123 天。 - Brilliand
1
将来如果你要指责我错误的话,我请求你在我的回答下面评论指出。我花了很长时间才注意到这一点。 - Brilliand
@Brilliand,你是对的。我已经相应地编辑了我的答案。 - Alvaro Neira
1
不仅仅是几个月。尝试使用new DateInterval('P3D') - days变量仍为空。使用new创建的DateInterval永远不会填充该变量。这就是我所说的“DateInterval构造函数”。 - Brilliand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接