Home > Software design >  How to find range diff 'datetime' and 'time'?
How to find range diff 'datetime' and 'time'?

Time:09-16

I want to find a range combining both data, that data has datetime and time data types, but datetime must ignore the time.

<?php
function test_duration($start_date, $end_date, $start_time, $end_time) {
    $timeInterval = '-';
    if(!empty($start_time) && !empty($end_time)) {
        $timeStart = new DateTime($start_date->format('Y-m-d').' '.$start_time->format('H:i:s'));
        $timeEnd = new DateTime($end_date->format('Y-m-d').' '.$end_time->format('H:i:s'));
        $timeInterval = $timeStart->diff($timeEnd)->format('%H:%I:%s');
    }
    return $timeInterval;
}

$start_date = '2022-09-15 01:01:01';
$end_date = '2022-09-15 02:02:02';
$start_time = '14:48:40';
$end_time = '14:48:45';

echo test_duration($start_date, $end_date, $start_time, $end_time);

?>

so the formula is like this:

range start ==> $start_date (just date)   $start_time
range end ==> $end_date (just date)   $end_time

range start - range end

From the code above it should produce a duration of 5 seconds.

Do you have any solution to fix my code above?

CodePudding user response:

Time is time, date is date, you shouldn't mix them, so let's say

$start_date = '2022-09-15';
$start_time = '13:00:00';
$end_date = '2022-09-15';
$end_time = '14:00:00';

print strtotime($end_date)   strtotime($end_time) - strtotime($start_date) - strtotime($start_time);

You'll get 3600 seconds

CodePudding user response:

If you know the date is in a fixed format can't you just explode the string on the central space like this?

<?php
function test_duration($start_date, $end_date, $start_time, $end_time) {
    $timeInterval = '-';
    if(!empty($start_time) && !empty($end_time)) {
        $startDateOnly=explode(' ',$start_date)[0];
        $endDateOnly=explode(' ', $end_date)[0];
        $timeStart = date_create_from_format('Y-m-d H:i:s', $startDateOnly." ".$start_time);
        $timeEnd = date_create_from_format('Y-m-d H:i:s', $endDateOnly." ".$end_time);
        $timeInterval = $timeStart->diff($timeEnd)->format('%h:%i:%s');
    }
    return $timeInterval;
}

$start_date = '2022-09-15 01:01:01';
$end_date = '2022-09-15 02:02:02';
$start_time = '14:48:40';
$end_time = '14:48:45';

echo test_duration($start_date, $end_date, $start_time, $end_time);
?>

CodePudding user response:

Your start is quite good, the use of DateTime class is one of the ways to solve your issue. The idea here can be illustrated as follows:

  • create a DateTime object from the starting date and then alter its time (hours, minutes and seconds) based on the starting time you supply.
  • do the same thing as the first step but for the ending date so we'll create a DateTime object from the ending date and then alter its time based on the ending time.
  • return the difference between the two dates in seconds:
    • to do so we will get the timestamps from both dates
    • make a simple subtraction of th two timestamps
    • return the result. We may return the absolute value here to always get a positive number for the case when the starting date is greater than the ending date (not required but that can be seen as an improvement).

Here's a live demo too

$startDate = '2022-09-15 01:01:01';
$endDate = '2022-09-15 02:02:02';
$startTime = '14:48:40';
$endTime = '14:48:45';

function diffInSeconds($startDate, $endDate, $startTime, $endTime)
{
    // create a DateTime object based on $startingDate and then alter the time to use the $startingTime instead
    $startDate = (new DateTime($startDate))->setTime(
        ($startTime = explode(':', $startTime))[0],
        $startTime[1],
        $startTime[2]
    );

    // create a DateTime object based on $endingDate and then alter the time to use the $endingTime instead
    $endDate = (new DateTime($endDate))->setTime(
        ($endTime = explode(':', $endTime))[0],
        $endTime[1],
        $endTime[2]
    );

    // return the difference in seconds which will always be positive thanks to the "abs" function
    return abs($endDate->getTimestamp() - $startDate->getTimestamp());
}

// run...
echo diffInSeconds($startDate, $endDate, $startTime, $endTime); // prints: 5

the above is code somehow primitive, it doesn't have any checks on whether the date/times are correct or not also it expects the times to be in the following format "HH:MM:SS".

Anyway, i strongly recommend looking at more modern utilities, especially the Carbon library which makes working with dates and times in PHP a piece of cake.

Learn more about DateTime objects on php.net.

CodePudding user response:

The time can easily be removed from the date with strstr. Then the pure date can be combined with the new time. strtotime is well suited when only seconds are to be determined.

$start_date = '2022-09-15 01:01:01';
$end_date = '2022-09-15 02:02:02';
$start_time = '14:48:40';
$end_time = '14:48:45';

$strStart = strstr($start_date, ' ', true).' '.$start_time;
$strEnd = strstr($end_date, ' ', true).' '.$end_time;
$seconds = strtotime($strEnd) - strtotime($strStart);  // int(5)
  •  Tags:  
  • php
  • Related