计算PHP中两个日期之间的差异

时间:2010-11-27 02:37:23

标签: php mysql

嗨,我的MySql数据库服务器上有几个帖子,每篇帖子中的一个信息内容是 datetime 格式的日期和时间(例如,2010-11-26 21 :55:09)这篇文章发表时。

因此,我希望使用函数NOW()从SQL服务器中检索实际日期和时间,并计算发布信息的秒数或分钟数或小时数或天数。

我不知道如何创建这个PHP脚本,但我知道肯定已经完成了,所以感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

你可以使用date_diff()函数

http://php.net/manual/en/function.date-diff.php

像...一样的东西。

<?php 
$now = time();
$then = $posttime;
$diff = date_diff($now,$then);
echo $diff->format('%R%d days'); #change format for different timescales
?>

编辑 -

我实际上使用此功能在我的一个Twitter应用上解决了这个问题...

function time_since ( $start )
{
    $end = time();
    $diff = $end - $start;
    $days = floor ( $diff/86400 ); //calculate the days
    $diff = $diff - ($days*86400); // subtract the days
    $hours = floor ( $diff/3600 ); // calculate the hours
    $diff = $diff - ($hours*3600); // subtract the hours
    $mins = floor ( $diff/60 ); // calculate the minutes
    $diff = $diff - ($mins*60); // subtract the mins
    $secs = $diff; // what's left is the seconds;
    if ($secs!=0) 
    {
        $secs .= " seconds";
        if ($secs=="1 seconds") $secs = "1 second"; 
    }
    else $secs = '';
    if ($mins!=0) 
    {
        $mins .= " mins ";
        if ($mins=="1 mins ") $mins = "1 min "; 
        $secs = '';
    }
    else $mins = '';
    if ($hours!=0) 
    {
        $hours .= " hours ";
        if ($hours=="1 hours ") $hours = "1 hour ";             
        $secs = '';
    }
    else $hours = '';
    if ($days!=0) 
    {
        $days .= " days "; 
        if ($days=="1 days ") $days = "1 day ";                 
        $mins = '';
        $secs = '';
        if ($days == "-1 days ") {
            $days = $hours = $mins = '';
            $secs = "less than 10 seconds";
        }
    }
    else $days = '';
    return "$days $hours $mins $secs ago";
}

您在检查时间的unix时间戳(传递时间)中传递它,并返回各种字符串。

答案 1 :(得分:4)

通常,您在查询中执行此类操作,但MySQL对于间隔不是很好(使用PostgreSQL会很容易)。您可以将其转换为unix时间戳,然后它将给出两个日期之间的秒数:

SELECT UNIX_TIMESTAMP() - UNIX_TIMESTAMP(your_datetime_column);

我考虑了DATEDIFF,但它只返回两个日期之间的天数

您可以在PHP中执行此操作,例如,使用DateTime类:

$date1 = new DateTime();
$date2 = new Datetime('2010-11-26 12:00:00');

var_dump($date1->diff($date2));

(如果你不是OOP的粉丝,有一种程序方法可以做到这一点。)
如果我不能使用RDBMS,这绝对是我使用的解决方案。 DateTime :: diff返回一个DateInterval对象,该对象包含两个日期之间的秒数,分钟数,小时数,天数等。

你也可以用PHP中的时间戳来做到这一点:

$num_sec = time() - strtotime('2010-11-26 12:00:00');

哪个会返回与SQL查询相同的内容。

答案 2 :(得分:4)

正如billythekid所说,如果你使用PHP5.3 +,你可以使用date_diff()函数,如果不是,那么有各种方法。如其他海报所示。如果你想知道分成“hours:mins:secs”层次结构的时间,那么MySQL中最快的方法是使用TIMEDIFF() function

SELECT TIMEDIFF(NOW(), '2010-11-26 12:00:00');

如果你想要它作为秒,使用MySQL或PHP中的unix时间戳功能,你可以使用strtotime()快速将MySQL日期转换为PHP。

答案 3 :(得分:0)

可以在SQL Query中找到一个简单的解决方案:

SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(post_date) AS seconds_ago FROM posts

此处的文档:MySQL Ref

答案 4 :(得分:0)

实际上我本人需要用PHP来完成此操作,而billythekid的帖子朝着正确的方向发展,却没有实现。我已经最小化了代码,尽管很明显第二个参数来自具有DATETIME列类型的数据库。

<?php
$interval = date_diff(date_create(date('Y-m-d H:i:s')), date_create($row1['date']));
echo $interval->format('%R%a days');

//Database: 2019-02-22
//PHP's date: 2018-07-07
//Result: +306 days
?>

一个显而易见的提示:如果只需要 整数,也可以只使用substr($interval->format('%R%a days'),1)