ask_alab
ask_alab

Reputation: 59

How to find the Time Difference between a PM time and AM time?

In my form there are 2 Time Pickers where user can select a from time and to time. It doesn't have a date associated with it. And for a report generating purpose I've to calculate the time difference between them. It works perfectly to if the From and to Time is "06:00 to 10:00" but if the from and to time is "21:00 to 02:00" I get a time difference of 19 hours. Could you please help me to fix this.

For this case "21:00 to 02:00" the time difference should be 5 hours.

This is the Code

$datetime1 = new \DateTime('09:30 PM');
$datetime2 = new \DateTime('02:00 AM');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%hh');

exit;

Upvotes: 1

Views: 377

Answers (2)

jspit
jspit

Reputation: 7703

The difference becomes negative If $totime is less than $fromtime. DateInterval->invert == 1 indicates that. This is used with this short solution to correct the result.

$fromtime = '09:30 PM';
$totime = '02:00 AM';

$diff = date_create($fromtime)->diff(date_create($totime));
$hours = $diff->invert ? 24-$diff->h : $diff->h;

echo $hours;  //5

Upvotes: 1

Samir Selia
Samir Selia

Reputation: 7065

Since you have 2 date pickers one for from time and another to time, the former will always be smaller than the latter. Hence when from time is larger than to time it means user has selected to from the next day. If we don't add a date for calculating difference, PHP will assume today's date by default. We can easily fix this by adding a condition to compare the times and prepend the dates accordingly. Below is the updated code.

<?php

$fromtime = '09:30 PM';
$totime = '02:00 AM';
$now = new \DateTime();
$today = $now->format('Y-m-d'); // Store current date

$now->add(new DateInterval('P1D')); // Add one day to current date to get next date
$nextDay = $now->format('Y-m-d'); // Store next date

if($fromtime > $totime) // If from time is bigger than to time, it means to is a next day
{
    $fromdatetime = "$today $fromtime";
    $todatetime = "$nextDay $totime";
}
else
{
    $fromdatetime = "$today $fromtime";
    $todatetime = "$today $totime";
}

$datetime1 = new \DateTime($fromdatetime);
$datetime2 = new \DateTime($todatetime);
$interval = $datetime1->diff($datetime2);
echo $interval->format('%hh');

?>

Upvotes: 0

Related Questions