0

I've the following code for calculation the difference in time

$estimated_time = '40:30';
$completed_time = '20:45';

// list the times
list($hours1, $minutes1) = explode(':', $estimated_time);
list($hours2, $minutes2) = explode(':', $completed_time);

// mktime
$t1 = mktime($hours1, $minutes1); // estimated time
$t2 = mktime($hours2, $minutes2); // completed time

// Calc the difference in seconds
$seconds = $t1 - $t2;
// hours
$hours     =  floor($seconds / (60*60));
// minutes
$minutes   =  floor(($seconds / 60) % 60);

// result 19:45
echo $diff = $hours . ':' . $minutes;

This calculation works because 19:45 is expected. The problem is when i change the time like this

// expected 4:30 extra hours but result is -5:30
// this is caused by the floor method but if I remove the floor
// method the positive value is not working correctly
$estimated_time = '40:00';
$completed_time = '44:30';

The result is -5:-30. This is caused be the floor. How could this works correctly with positive and negative values. Also is this a correct way to calculate with times.

I have tried to use DateTime but it could not handles hours greater then 24

SOLVED Thx to @Mad Dog PHP calc difference between time greater than 24 hours

$estimated_time = '40:30';
$completed_time = '20:55';

// invert
// 0 => positive
// 1 => negative

// list the times
list($hours1, $minutes1) = explode(':', $estimated_time);
list($hours2, $minutes2) = explode(':', $completed_time);

$date1 = new DateTime('now', new DateTimeZone('UTC'));
$date2 = new DateTime('now', new DateTimeZone('UTC'));
$time1 = new DateInterval('PT'.$hours1.'H'.$minutes1.'M');
$time2 = new DateInterval('PT'.$hours2.'H'.$minutes2.'M');

$date1->add($time1);
$date2->add($time2);

$diff = $date2->diff($date1);
$result = ($diff->days * 24 + $diff->h) . $diff->format(':%I');

if($diff->invert == 0){
    echo $result;
} else {
    echo 0 . ' (extra time: '.$result.')';
}
Community
  • 1
  • 1
Bham
  • 309
  • 5
  • 21
  • http://php.net/manual/en/function.date-diff.php – Peon Nov 22 '16 at 18:09
  • The better approach is to use the DateTime class: http://php.net/manual/en/datetime.construct.php, then you can use [`DateTime::diff`](http://php.net/manual/en/datetime.diff.php) – Qirel Nov 22 '16 at 18:10
  • Could DateTime handles time greater then 24 hours? – Bham Nov 22 '16 at 18:16

0 Answers0