查找两个日期时间之间的差异,并将其格式化为Y-m-d H:i:s。

43

我想要计算两个日期时间之间的差值并将其返回为一个datetime类型。我已经找到了使用diff函数的例子,但我似乎无法正确地使用它。

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

然而$totaltime记录在我的数据库中为0000-00-00 00:00:00。这是因为我没有格式化我的totaltime变量吗?


date() 函数返回字符串,你无法使用字符串计算差异。 - Misch
7个回答

96

我不确定您在寻找什么样的差异格式,但以下是使用DateTime执行此操作的方法

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;

抛出错误 "致命错误:调用未定义的方法 DateTime::diff()" - Staleyr
你正在运行哪个版本的PHP? - John Conde
这应该适合您,因为5.4支持 diff() http://codepad.viper-7.com/FqGsrO - John Conde
1
我发现我的问题在于将日期时间写入数据库,如果是日期,它可以很好地写入数据库,但是日期时间不行。它需要采用以下格式:YYYY-MM-DD HH:MM:SS或Y-m-d H:i:s。 - Staleyr
此答案未以正确格式提供结果。 - mickmackusa

11
您可以使用datetime diff和format来计算时间差。
<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

更多关于日期时间格式的详细信息,请参考此处: 这里
您可以按照自己的方式更改时间间隔格式。 这里是一个可工作的示例。
注:这些功能(diff()format())仅适用于>=PHP 5.3.0版本。

踩一下。这并没有按照原帖作者要求的格式提供结果。 - mickmackusa

3
约翰·康德在他的方法中执行了所有正确的步骤,但没有满足您问题的最后一步,即按照您的规格格式化结果。根据您的使用情况,printf()sprintf()是一种优雅的方式,可以使用所需的前导零格式化整数 - DateTime类的format()方法不允许应用前导零。
下面的演示将显示原始差异,暴露尝试立即格式化原始差异的麻烦,并呈现正确格式化的结果。
代码:(演示
$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millennium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: " . $diff->format('%y years %m months %d days %h hours %i minutes %s seconds') . "\n";

// Notice the impact when you change $datetime2's millennium from '1' to '2'
echo "Invalid format: " . $diff->format('%Y-%m-%d %H:%i:%s') . "\n";  // only H does it right

// isolated datetime diff values
$details = array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));
echo '$diff = ' . var_export($details, true) . "\n";

// now all components of datetime are properly padded
printf(
    "Valid format: %04d-%02d-%02d %02d:%02d:%02d",
    $diff->y,
    $diff->m,
    $diff->d,
    $diff->h,
    $diff->i,
    $diff->s
);

输出:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$diff = array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

2
下面的代码仅显示找到的值之间的差异,即如果年份为0,则不会显示年份。

$diffs = [
    'years' => 'y',
    'months' => 'm',
    'days' => 'd',
    'hours' => 'h',
    'minutes' => 'i',
    'seconds' => 's'
];

$interval = $timeout->diff($timein);
$diffArr = [];
foreach ($diffs as $k => $v) {
    $d = $interval->format('%' . $v);
    if ($d > 0) {
        $diffArr[] = $d . ' ' . $k;
    }
}    
$diffStr = implode(', ', $diffArr);
echo 'Difference: ' . ($diffStr == '' ? '0' : $diffStr) . PHP_EOL;

0
抱歉,我之前的回答是错误的。如果您想要计算时间和超时之间的总经过时间,并以“Y-m-d H:i:s”格式呈现,请使用“DateTime”对象计算超时和时间之间的差异,并将其格式化为“'%y-%m-%d %H:%i:%s'”。请保留HTML标签。

2
请详细解释您的答案,不要仅仅贴代码。 - MrMaavin

-2

我收集了许多主题,以制作具有多个输出(年、月、日、小时、分钟、秒)的通用函数,可以将其转换为字符串或解析为整数,并且如果您需要知道差异的方向,则可以使用+-。

使用示例:



    $date1='2016-05-27 02:00:00';
    $format='Y-m-d H:i:s';

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format); 
    #1 years 3 months 2 days 22 hours 1 minutes 59 seconds (string)

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format,false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 00:00:00', $format, '2017-08-30 00:01:59', $format,true, '%d days -> %H:%I:%S', true);
    #-3 days -> 00:01:59 (string)

    echo timeDifference($date1, $format, '2016-05-27 00:05:51', $format, false, 'seconds');
    #9 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, false, 'hours');
    #5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours');
    #-5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours',true);
    #-5 (int)

函数



    function timeDifference($date1_pm_checked, $date1_format,$date2, $date2_format, $plus_minus=false, $return='all', $parseInt=false)
    {
        $strtotime1=strtotime($date1_pm_checked);
        $strtotime2=strtotime($date2);
        $date1 = new DateTime(date($date1_format, $strtotime1));
        $date2 = new DateTime(date($date2_format, $strtotime2));
        $interval=$date1->diff($date2);

        $plus_minus=(empty($plus_minus)) ? '' : ( ($strtotime1 > $strtotime2) ? '+' : '-'); # +/-/no_sign before value 

        switch($return)
        {
            case 'y';
            case 'year';
            case 'years';
                $elapsed = $interval->format($plus_minus.'%y');
                break;

            case 'm';
            case 'month';
            case 'months';
                $elapsed = $interval->format($plus_minus.'%m');
                break;

            case 'a';
            case 'day';
            case 'days';
                $elapsed = $interval->format($plus_minus.'%a');
                break;

            case 'd';
                $elapsed = $interval->format($plus_minus.'%d');
                break;

            case 'h';       
            case 'hour';        
            case 'hours';       
                $elapsed = $interval->format($plus_minus.'%h');
                break;

            case 'i';
            case 'minute';
            case 'minutes';
                $elapsed = $interval->format($plus_minus.'%i');
                break;

            case 's';
            case 'second';
            case 'seconds';
                $elapsed = $interval->format($plus_minus.'%s');
                break;

            case 'all':
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format('%y years %m months %d days %h hours %i minutes %s seconds');
                break;

            default:
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format($return);
        }

        if($parseInt)
            return (int) $elapsed;
        else
            return $elapsed;

    }


-4

这是我的完整帖子,主题为: PHP查找两个日期时间之间的差异

用法示例


    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2017-08-30 00:01:59', 'Y-m-d H:i:s', false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2016-05-27 07:00:00', 'Y-m-d H:i:s', true, 'hours',true);
    #-5 (int)

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