提问者:小点点

PHP查找两个日期时间之间的差异


我试图获取两个datetime之间的差异,并将其作为datetime返回。我找到了使用diff的示例,但我似乎无法正确理解。

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

但是,$totaltime0000-00-00 00:00:00记录到我的数据库中。这是因为我没有格式化totaltime变量吗?


共3个答案

匿名用户

我不知道你在寻找什么样的格式,但这里是如何使用日期时间

$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差异和格式来计算差异。

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

有关DATETIME格式的更多信息,请参考:这里
您可以按照您想要的方式更改间隔格式。

这里是工作的例子

另外,这些功能(diff()和format())与

匿名用户

约翰·康德在他的方法中做了所有正确的程序,但没有满足你问题的最后一步,那就是根据你的规范格式化结果。

这段代码(演示)将显示原始差异,暴露试图立即格式化原始差异的麻烦,显示我的准备步骤,最后呈现正确格式化的结果:

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millenium 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 millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n";  // only H does it right

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));

echo '$detail array: ';
var_export($details);
echo "\n";

array_map(function($v,$k)
    use(&$r)
    {
        $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
        if($k=='y' || $k=='m'){$r.="-";}
        elseif($k=='d'){$r.=" ";}
        elseif($k=='h' || $k=='i'){$r.=":";}
    },$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded

输出:

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

现在解释我的日期时间值准备:

$details获取diff对象并将其强制转换为数组。array_flip(['y'、'm'、'd'、'h'、'i'、's'])创建一个密钥数组,该数组将用于使用array_intersect_key()从(array)$diff中删除所有不相关的密钥。

然后使用array_map()我的方法迭代$细节中的每个值和键,用0将其左侧填充到适当的长度,并用必要的分隔符连接$r(结果)字符串请求的日期时间格式。