'PHP Parse time Days/hours/minutes + round up to closest step

I Have system, where people ar tracking there spent time on project. After project is ending, I want to count there spent time + round up to closest step

For now, I have function, that only convert time to readable format

function parse_time($t, $k="",$step){
    if($t == 0){
        if($k == ""){
            return $t;
        }
        return $k;
    } else {
        if($t >= 3600){
            $h=floor($t/3600);
            $a=$t%3600;

            if($a >= 60){
                $m=round($a/60);
            } else {
                $m=0;
            }
        } else{
            $h=0;
            $m=round($t/60);
        }

        $d=($d > 0)?$d."d":"";
        $h=($h > 0)?$h."h":"";
        $m=($m > 0)?$m."min":"";

        $t=$d.$h.$m;

        return $t;
    }
}

I want to add parameter to function step ( in minutes ), So

If the step = 5 parsed time 41h 20min output 41h 25min

If the step = 15 parsed time 41h 20min output 41h 30min

If the step = 20 parsed time 41h 20min output 41h 20min

If the step = 30 parsed time 41h 20min output 41h 30min

If the step = 60 parsed time 41h 20min output 42h 0min

If the step = 180 parsed time 41h 20min output 42h 0min

If the step = 0 parsed time 41h 20min output 41h 20min

What would be best solution to do that? Thank you :)

php


Solution 1:[1]

The solution is to convert all times and intervals to seconds and then work with modulo (%).

First of all, I'll give you two useful help functions.

function strTimeToSeconds(string $time): int {
  return strtotime('1970-01-01 '.$time.' UTC');
}

function secondsToHuman(int $seconds):string {
  $hours = (int)($seconds/3600);
  $seconds -= $hours * 3600;
  return $hours.':'.gmdate('i:s',$seconds);
}

A example. Given are 148800 seconds (=41hours 20min).

$seconds = 148800;
$interval = strTimeToSeconds('15 minutes');  //900 Sec

Round up to closest interval:

$seconds = $seconds - $seconds%$interval + $interval;  //149400 

To convert seconds to hours, minutes and seconds we now use secondsToHuman().

echo secondsToHuman($seconds);  //41:30:00

Solution 2:[2]

Thanks @jspit

Works as expected :)

function step($a, $b) {
if ($a == 0){$seconds = 0;} else {$seconds = $a-1;}
if ($b == 0){$step = 0;} else {$step = $b*60;}
$seconds = $seconds - $seconds%$step + $step;
return $seconds;
}
echo secondsToHuman(step(3900, 5));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 jspit
Solution 2 Elvis Loksts