获取PHP中两个日期时间之间的间隔秒?

时间:2009-10-05 10:12:45

标签: php datetime

2009-10-05 18:11:08

2009-10-05 18:07:13

这应该生成235,怎么做?

8 个答案:

答案 0 :(得分:140)

使用DateTime对象,您可以这样做:

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();

答案 1 :(得分:73)

您可以使用strtotime()执行此操作:

$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

使用DateTime对象可以采用类似的方法,例如

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diff = $date2->getTimestamp() - $date->getTimestamp();

答案 2 :(得分:8)

PHP日期时间参考对以下内容有帮助:PHP Date Time Functions

strtotime()可能是最好的方法。

$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

答案 3 :(得分:4)

由于unix epoch限制,你可能会遇到1970年之前和2038年之后的日期问题。我选择松散精度(=不看单秒)但避免通过unix epoch转换(getTimestamp)。这取决于你要做什么......

在我的情况下,使用365而不是(12 * 30)和“30”作为平均月长,减少了可用输出中的错误。

function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
    $diff = $end->diff($start);
    $diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
                ($diff->s)+ // seconds (no errors)
                (60*($diff->i))+ // minutes (no errors)
                (60*60*($diff->h))+ // hours (no errors)
                (24*60*60*($diff->d))+ // days (no errors)
                (30*24*60*60*($diff->m))+ // months (???)
                (365*24*60*60*($diff->y)) // years (???)
                );
    return $diff_sec;
}

请注意,如果“均值”数量用于差异,则错误可能为0。 PHP文档没有谈到这个...... 在一个不好的情况下,错误可能是:

    如果对时间间隔施加差异,则
  • 0秒< 1个月
  • 0至3天如果差异应用于时间间隔&gt; 1个月
  • 如果对时间间隔应用差异,则为0至14天。 1年

我更倾向于假设某人决定将“m”视为30天而将“y”视为365,当“差异”走过非30天的月份时,将“d”视为差异......

如果有人了解更多相关信息并提供官方文档,欢迎提供!

答案 4 :(得分:2)

strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")

答案 5 :(得分:2)

如果您需要真实的本地时差并想使用getTimestamp,则必须考虑在计算的期间内的DST开关。因此,方程中必须包含UTC的局部偏移量。

例如,采用以下日期:

$tz = new \DateTimeZone("Europe/Berlin");
$start = new \DateTime("2018-02-01 12:00:00", $tz);
$end = new \DateTime("2018-04-01 12:00:00", $tz);

$start在UTC中是“ 2018-02-01 11:00:00”,而$end在UTC中是“ 2018-04-01 10:00:00”。请注意,尽管柏林时区中的一天中的时间相同,但UTC中的时间却有所不同。 UTC偏移量在$start中是一小时,在$end中是2小时。

请记住,getTimestamp总是返回UTC!因此,在寻找实际的局部差异时,必须从时间戳中减去偏移量。

// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();

// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());

答案 6 :(得分:2)

对于那些担心使用时间戳的限制(即使用 1970 年之前和 2038 年之后的日期)的人,您可以像这样简单地计算秒差:

$start = new DateTime('2009-10-05 18:11:08');
$end = new DateTime('2009-10-05 18:07:13');
$diff = $end->diff($start);

$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->h * 60 * 60;
$minsInSecs = $diff->i * 60;

$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->s;

echo $seconds; // output: 235

为有兴趣阅读更多内容的人写了一篇blog post

答案 7 :(得分:-1)

一个简单而精确的解决方案(以Nilz11的评论为例):

$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 + 
   $diff->format("%i")) * 60 + $diff->format("%s");