Rana
Rana

Reputation: 6154

get php DateInterval in total 'minutes'

I am trying to get the PHP "DateInterval" value in "total minutes" value. How to get it? Seems like simple format("%i minutes") not working?

Here is the sample code:

$test = new \DateTime("48 hours");
$interval = $test->diff(new \DateTime());

Now if I try to get the interval in total days, its fine:

echo $interval->format('%a total days');

It is showing 2 days as output, which is totally fine. What I am trying to get if to get the value in "total minutes", so I tried:

echo $interval->format('%i total minutes');

Which is not working. Any help appreciated to get my desired output.

Upvotes: 42

Views: 46656

Answers (6)

Sebastian Viereck
Sebastian Viereck

Reputation: 5885

Here is the excepted answer as a method in PHP7.2 style:

public static function getMinutesDifference(\DateTime $a, \DateTime $b): int
{
    return abs($a->getTimestamp() - $b->getTimestamp()) / 60;
}

Upvotes: 4

Samuel Gfeller
Samuel Gfeller

Reputation: 1000

This question is about minutes but if you want to recalculate every carry over points (like I needed to) you can use this solution suggested by @glavic in the comments on the php.net man page (simplified and turned into a function):

private function calculateCarryOverPoints(\DateInterval $dateInterval): \DateInterval
{
    $from = new \DateTime;
    $to = clone $from;
    // Add time of dateInterval to empty DateTime object
    $to = $to->add($dateInterval);
    // Calculate difference between zero DateTime and DateTime with added DateInterval time
    // Which returns a DateInterval object $diff with correct carry over points (days, hours, minutes, seconds etc.)
    return $from->diff($to);
}

Upvotes: 0

ggallego
ggallego

Reputation: 31

That works perfectly.

function calculateMinutes(DateInterval $int){
    $days = $int->format('%a');
    return ($days * 24 * 60) + ($int->h * 60) + $int->i;
}

Upvotes: 3

Genmais
Genmais

Reputation: 1137

I wrote two functions that just calculates the totalTime from a DateInterval. Accuracy can be increased by considering years and months.

function getTotalMinutes(DateInterval $int){
    return ($int->d * 24 * 60) + ($int->h * 60) + $int->i;
}

function getTotalHours(DateInterval $int){
    return ($int->d * 24) + $int->h + $int->i / 60;
}

Upvotes: 17

Neil Townsend
Neil Townsend

Reputation: 6084

If you are stuck in a position where all you have is the DateInterval, and you (like me) discover that there seems to be no way to get the total minutes, seconds or whatever of the interval, the solution is to create a DateTime at zero time, add the interval to it, and then get the resulting timestamp:

$timeInterval      = //the DateInterval you have;
$intervalInSeconds = (new DateTime())->setTimeStamp(0)->add($timeInterval)->getTimeStamp();
$intervalInMinutes = $intervalInSeconds/60; // and so on

Upvotes: 31

deceze
deceze

Reputation: 522081

abs((new \DateTime("48 hours"))->getTimestamp() - (new \DateTime)->getTimestamp()) / 60

That's the easiest way to get the difference in minutes between two DateTime instances.

Upvotes: 81

Related Questions