2013-03-28 142 views
9

我试图获取两个日期时间之间的差异并将其作为日期时间返回。我发现使用差异的例子,但我似乎无法得到它的权利。PHP找到两个日期时间之间的差异

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

但是$ totaltime logs“0000-00-00 00:00:00”到我的数据库。这是因为我没有格式化我的总时间变量?

+0

date()为您提供了字符串。你不能用字符串计算差异。 – Misch

回答

35

我不知道你要找什么样的格式在您的差异,但在这里是如何使用的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; 
+0

抛出错误“致命错误:调用未定义方法DateTime :: diff()” – Staleyr

+0

您运行的是哪个版本的PHP? –

+0

5.4,在netbeans – Staleyr

1

您可以简单地使用日期时间差异和格式计算差额做到这一点。

<?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是工作示例

P.S.这些功能( diff()format())与> = PHP 5.3.0工作仅

+1

键盘连接断开 – pal4life

+0

Downvote。这不会以OP所要求的格式提供结果。 – mickmackusa

-1
<?php 
$val1 = '2014-04-10 11:34:09'; 
$val2 = '2015-04-10 10:56:15'; 
$result1 = (explode(' ', $val1)) ; 
$result2 = (explode(' ', $val2)) ; 
$date1= new DateTime($result1[0]); 
$date2=new DateTime($result2[0]); 
$diffdate=date_diff($date1,$date2); 
$difftime = strtotime($result1[1]) - strtotime($result2[1]); 
$dates=$diffdate->format("%R%a days"); 
echo $dates; 
echo $difftime; 
?> 
+0

尽管这段代码可能解决这个问题,但代码中的[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – Rizier123

+0

代码查找datetime –

+1

Downvote的区别。这个更近的答案并不比现在接受的答案好,并且在答案本身中没有提供任何解释。它没有提供问题要求的结果。这是一个低合格的答案,需要进行编辑或删除。 – mickmackusa

-1
<?php 
$value='20140203113405'; 
$val='20150203113410'; 

$val1=str_split($val,2); 
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3]; 
$timeval1=$val1[4].":".$val1[5].":".$val1[6]; 

$val2=str_split($value,2); 
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3]; 
$timeval2=$val2[4].":".$val2[5].":".$val2[6]; 

$date1=new DateTime($dateval1); 
$date2=new DateTime($dateval2); 
$diffdate=date_diff($date1,$date2); 
$dates=$diffdate->format("%a days"); 
$difftime = strtotime($timeval1) - strtotime($timeval2); 
echo $dates; 
echo $difftime."seconds"; 
?> 
+2

虽然此代码片段可能会解决问题,但代码中的[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – Rizier123

+0

iam试图以这种格式获取日期时间的差异 –

+0

Downvote。这个更近的答案并不比现在接受的答案好,并且在答案本身中没有提供任何解释。它没有提供问题要求的结果。这是一个低合格的答案,需要进行编辑或删除。而不是用多个低质量答案乱丢页面,只发布一个答案(最好的答案)并删除其余答案。 – mickmackusa

0

约翰·孔德确实在他的方法,所有正确的过程,但不能满足你的问题的最后一步是要将结果格式化为您的规格。

此代码(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需要日e diff object并将其转换为数组。 array_flip(['y','m','d','h','i','s'])创建一个键数组,它将用于从(array)$diff使用array_intersect_key()删除所有不相关的键。

然后,使用array_map()我的方法迭代的每个值和密钥中$details,衬垫其左侧与0的适当的长度,并连接所述$r(结果)字符串必要隔板与所请求日期时间格式相一致。