我正在尝试获取两个日期时间之间的差异并将其作为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
记录到我的数据库中。这是因为我没有格式化我的总时变量吗?
答案 0 :(得分:53)
我不确定你的差异是什么格式,但是这里是如何使用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;
答案 1 :(得分:3)
您可以简单地使用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');
?>
有关DATETIME格式的更多信息,请参阅:here
您可以按照您想要的方式更改间隔格式。
Here是工作示例
答案 2 :(得分:1)
John Conde在他的方法中执行了所有正确的程序,但并不能满足您的问题的最后一步,即将结果格式化为您的规格。
此代码(Demo)将显示原始差异,尝试立即格式化原始差异,显示我的准备步骤,最后显示格式正确的结果,从而暴露出麻烦:
$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 object并将其转换为数组。
array_flip(['y','m','d','h','i','s'])创建了一系列密钥,用于使用array_intersect_key()从(array)$diff
删除所有不相关的密钥。
然后使用array_map()我的方法迭代$details
中的每个值和键,使用0
将其左侧填充到适当的长度,并连接{{1 (结果)带有必要分隔符的字符串,以符合请求的日期时间格式。
答案 3 :(得分:0)
对不起,我之前的回答是错误的。如果您尝试采用Ymd H:i:s格式获取时间与超时之间的总时间,请使用DateTime对象获取超时与时间之间的差异,并将其格式设置为'%y-%m-%d%H: %i:%s'。
答案 4 :(得分:0)
下面的代码将仅显示发现值的差异,即,如果years = 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;
答案 5 :(得分:-1)
我收集了许多主题以使通用功能具有很多输出(年,月,日,小时,分钟,秒),并带有字符串或解析为int和direction +-(如果您需要知道差异的方向是哪一侧)。
使用示例:
$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;
}
答案 6 :(得分:-1)
这是我有关主题的完整文章: PHP find difference between two datetimes
用法示例
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)