2013-01-11 35 views

回答

22

有一个功能format这一点。但它不会返回秒数。要获取的秒数如果你真的想使用$interval你需要计算它,你使用这种技术

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

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

这里

  • 86400是秒在一天
  • 3600数目是秒一小时
  • 60数量是在一分钟内的秒数
+0

它正在返回'0秒' – sanchitkhanna26

+0

@MarkBaker是的,这就是为什么我改变了我的答案 –

+0

太棒了!我得到了这个工作。谢谢@shiplu – sanchitkhanna26

35

另一种获得间隔i秒数的方法s到它添加到零为止,并获得该日期的时间戳:

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

此方法将处理通过DateInterval构造器创建或多或少正确的时间间隔,而shiplu's answer会忽略这样的年,月,日间隔。但是,对于通过减去两个日期创建的间隔,shiplu的答案更准确。对于只包含小时,分钟和秒的间隔,两种方法都会得到正确的答案。

+0

@Brilliand为什么这个解决方案对于通过减去两个日期而创建的间隔来说不够精确?我不明白如何。你可以解释吗 ? – MaxiWheat

+3

@MaxiWheat说时间间隔是从2015-03-01减去2015-02-01创建的。这是一个月的差距,恰好等于28天。 Shiplu的方法将这种情况视为28天的间隔,而我的方法会将其视为一个月的间隔,随机选取1月为月份,并根据1月份的31天产生时间戳。 – Brilliand

2

我只会增加shiplu's answer:

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'); 

它处理不好。

+0

这个失败的时间间隔的例子是'new DateInterval('P4M3DT2H')'。尝试一下,看看 - days'变量是空的,尽管间隔跨度大约为123天。 – Brilliand

+0

未来,如果您要指责我错了,我请求您在评论我的答案时这样做。我花了很长时间才注意到这一点。 – Brilliand

+0

@Brilliand,你是对的。我相应地编辑了我的答案。 –