PHP находит разницу между двумя датами

Я пытаюсь получить разницу между двумя датами и вернуть его как дату. Я нашел примеры с использованием diff, но я не могу понять, что это правильно.

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

Однако $ totaltime logs "0000-00-00 00:00:00" в мою БД. Это потому, что я не форматирую свою общую переменную времени?

Я не уверен, какой формат вы ищете в своей разнице, но вот как это сделать, используя 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 и 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 см. Здесь :
Вы можете изменить формат интервала так, как вы хотите.

Вот рабочий пример

PS Эти функции ( diff () и format () ) работают только с> = PHP 5.3.0

Джон Конде делает все правильные процедуры в своем методе, но не удовлетворяет заключительному этапу вашего вопроса, который должен отформатировать результат по вашим спецификациям.

Этот код ( демонстрация ) отобразит необработанную разницу, выявит проблему, пытаясь сразу же форматировать разницу в исходном состоянии, отобразить мои шаги подготовки и, наконец, представить правильно отформатированный результат:

 $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)$diff с помощью array_intersect_key () .

Затем, используя array_map (), мой метод выполняет итерацию каждого значения и ключа в $details , выравнивает его левую сторону до соответствующей длины с помощью 0 и объединяет строку $r (result) с необходимыми разделителями для соответствия запрошенному формату datetime.

 <?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"; ?> 
 <?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; ?>