MathieuB
MathieuB

Reputation: 527

PHP handle time value over 24:00H

I'm addditioning time value of a schedule. When The value go over 24:00 I'm begining to have a problem..

Here is a simple example of what i'm trying to do.

$now = strtotime("TODAY");
$time_1 = strtotime('08:00:00') - $now;
$total = $time_1 * 5;
$total = $total + $now;
echo date('H:i', $total);

The echo value is 16:00:00 But it should be 40:00:00

24:00:00 + 16:00:00 = 40:00:00

So I understand that this is 1 day and 16 hours.

How can I echo 40:00:00

Upvotes: 0

Views: 132

Answers (3)

Ryan Kempt
Ryan Kempt

Reputation: 4209

Below is your example code working the way you want.

As others have mentioned, you have to do the math yourself for cases like this.

<?php

$now = strtotime("TODAY");
$time_1 = strtotime('08:00:00') - $now;
$total = $time_1 * 5;

$secs = $total%60;
$mins = floor($total/60);
$hours = floor($mins/60);
$mins = $mins%60;

printf("%02d:%02d:%02d", $hours, $mins, $secs);

Upvotes: 2

Marc B
Marc B

Reputation: 360872

You can't. date() is intended to produce VALID date/time strings. 40 is not something that would appear in a normal time string. You'll have to use math to generate that time string on your own:

$seconds = $total;
$hours = $seconds % 3600;
$seconds -= ($seconds * 3600);
$minutes = $seconds % 60;
$seconds -= ($seconds * 60);

$string = "$hours:$minutes:$seconds";

Upvotes: 2

Mark Reed
Mark Reed

Reputation: 95375

The date function is for dates and times, not durations. Since the time is never "40:00", it will never return that string.

You can look into using the DateTimeInterface to get what you want, but it might be simpler just to do the math yourself.

$seconds = $total;
$minutes = (int)($seconds/60);
$seconds = $seconds % 60;
$hours   = (int)($minutes / 60);
$minutes = $minutes % 60;

$str = "$hours:$minutes:$seconds";

Upvotes: 1

Related Questions