Convert time in HH:MM:SS format to seconds only?
Asked Answered
I

12

87

How to turn time in format HH:MM:SS into a flat seconds number?

P.S. Time could be sometimes in format MM:SS only.

Inventor answered 29/1, 2011 at 0:4 Comment(0)
L
151

No need to explode anything:

$str_time = "23:12:95";

$str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time);

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = $hours * 3600 + $minutes * 60 + $seconds;

And if you don't want to use regular expressions:

$str_time = "2:50";

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;
Likker answered 29/1, 2011 at 0:10 Comment(5)
When using time functions I had to mess around with timezones to get it right, but this is much simpler.Saponify
Mistake in the last line:$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; Should be $time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;Paquito
Actually, shouldn't the last line be: isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; If there is no hour, then need to treat hours as minutes and minutes as seconds. For example: 10:01 should be 601 seconds.Traditional
@rlorenzo: Yes. Someone edited my answer and broke it.Likker
Colons do not need to be escaped in the pattern. [\d] is more simply expressed as \d.Supertax
B
117

I think the easiest method would be to use strtotime() function:

$time = '21:30:10';
$seconds = strtotime("1970-01-01 $time UTC");
echo $seconds;

// same with objects (for php5.3+)
$time = '21:30:10';
$dt = new DateTime("1970-01-01 $time", new DateTimeZone('UTC'));
$seconds = (int)$dt->getTimestamp();
echo $seconds;

demo


Function date_parse() can also be used for parsing date and time:

$time = '21:30:10';
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];

demo


If you will parse format MM:SS with strtotime() or date_parse() it will fail (date_parse() is used in strtotime() and DateTime), because when you input format like xx:yy parser assumes it is HH:MM and not MM:SS. I would suggest checking format, and prepend 00: if you only have MM:SS.

demo strtotime()
demo date_parse()


If you have hours more than 24, then you can use next function (it will work for MM:SS and HH:MM:SS format):

function TimeToSec($time) {
    $sec = 0;
    foreach (array_reverse(explode(':', $time)) as $k => $v) $sec += pow(60, $k) * $v;
    return $sec;
}

demo

Broeder answered 2/1, 2014 at 0:24 Comment(9)
strtotime() does not allow the hours go beyond 24 - using 25 or higher will return "false".Pewter
Your 3rd answer for times over 24 hours is exactly what I needed. The array_reverse and explode on : then causing one more trip through the foreach and another pow (so that both hh:mm AND hh:mm:ss work without modification of the function) is a stroke of genius. Code par excellence. I can hardly imagine a more efficient example. Thanks!Elanorelapid
@Broeder Some how helps me tooPhysician
What if it is containing dot . like this 00:20:55.60000? I tried to post a question, but there seems a problem.Judaic
@KeepMove: remove microseconds, on round them to seconds part.Daryldaryle
I just looked at the first answer, and thought, what if I used the Unix epoch... up vote from me!Spitz
The third option works for every valid format I could throw at it. 👍Osman
@Judaic The third option works with milliseconds and nanoseconds, too, as it's just a comma-value. It's a really interesting way to solve this...Idiomorphic
The first option $seconds = strtotime("1970-01-01 $time UTC"); should be the shortest answer and the accepted one. The use of 1970-01-01 is genial!Beecher
K
17
    $time = 00:06:00;
    $timeInSeconds = strtotime($time) - strtotime('TODAY');
Keheley answered 9/1, 2017 at 10:28 Comment(0)
T
12

You can use the strtotime function to return the number of seconds from today 00:00:00.

$seconds= strtotime($time) - strtotime('00:00:00');
Toandfro answered 23/1, 2018 at 12:3 Comment(1)
While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. Please also try not to crowd your code with explanatory comments, this reduces the readability of both the code and the explanations!Palocz
D
6

In pseudocode:

split it by colon
seconds = 3600 * HH + 60 * MM + SS
Discreditable answered 29/1, 2011 at 0:5 Comment(2)
As he wrote, it's pseudocode. "Pretend code" to explain how something could be done.Swaddle
It doesn't matter whether it's pseudocode or not because the question requires supporting MM:SS format which this answer does not.Osman
O
5

Try this:

$time = "21:30:10";
$timeArr = array_reverse(explode(":", $time));
$seconds = 0;
foreach ($timeArr as $key => $value)
{
    if ($key > 2) break;
    $seconds += pow(60, $key) * $value;
}
echo $seconds;
Opposition answered 29/1, 2011 at 0:22 Comment(2)
I love it! $time = "01:23:54:21:30:10" gives me an answer of 1087421410 seconds.Leslielesly
Try it now. Ofcourse you can pass something like "898989:8989898:899899", but I assume basic validations will be done on the time entered before code reached to the seconds calculation.Opposition
S
2

Simple

function timeToSeconds($time)
{
     $timeExploded = explode(':', $time);
     if (isset($timeExploded[2])) {
         return $timeExploded[0] * 3600 + $timeExploded[1] * 60 + $timeExploded[2];
     }
     return $timeExploded[0] * 3600 + $timeExploded[1] * 60;
}
Sunglass answered 9/10, 2015 at 5:58 Comment(0)
F
1
function time2sec($time) {
    $durations = array_reverse(explode(':', $item->duration));
    $second = array_shift($durations);
    foreach ($durations as $duration) {
        $second += (60 * $duration);
    }
    return $second;
}
echo time2sec('4:52'); // 292
echo time2sec('2:01:42'); // 7302
Flosi answered 8/9, 2020 at 21:39 Comment(1)
This answer is cleanest, except for $item->duration, which should just be replaced by $time. And it should probably do some casting.Grilse
M
0

On Windows 32 bit PHP version: 7.2.31 i get some error on all versions posted here. If the time was 00:00:00 or 00:00:00 the zeros 00 were returned and used as "" empty string, and calculation with empty string returns error "A Non WELLNUMERIC blabla.

This Works also with more then 24hours:

function TimeToSec(string $time) {
   $timearray = explode(":",$time);
   $hours   = (int)$timearray[0];
   $minutes = (int)$timearray[1];
   $seconds = (int)$timearray[2];;

  //echo "Hours: " . $hours ."<br>";
   //echo "minutes: " . $minutes ."<br>";
   //echo "seconds: " . $seconds ."<br>";

   $value = ($hours * 3600) + ($minutes * 60) + $seconds;
return $value;
}

echo TimeToSec("25:00:30");
Melodious answered 30/9, 2022 at 11:38 Comment(0)
V
0

To cover HH:MM:SS, MM:SS, and SS cases.

function getSeconds(string $time) {
    $match = sscanf($time, "%d:%d:%d", $t1, $t2, $t3);
    return match ($match) {
        1 => $t1,
        2 => $t1 * 60 + $t2,
        3 => $t1 * 3600 + $t2 * 60 + $t3,
        default => 0
    };
}

echo getSeconds("02:50");   // 170
echo getSeconds("1:02:50"); // 3770
echo getSeconds("50");      // 50

`

Vat answered 14/2 at 2:26 Comment(0)
P
0

Will work with any format ("HH:MM:SS", "MM:SS" or "SS")

function timeToSeconds(string $time): int { 
    return array_reduce(explode(':', $time), fn ($x, $i) => $x * 60 + $i, 0);
}
Peddle answered 7/3 at 13:6 Comment(0)
S
-1
<?php
$time    = '21:32:32';
$seconds = 0;
$parts   = explode(':', $time);

if (count($parts) > 2) {
    $seconds += $parts[0] * 3600;
}
$seconds += $parts[1] * 60;
$seconds += $parts[2];
Swaddle answered 29/1, 2011 at 0:7 Comment(4)
What if it was only 32:32 without the hour?Inventor
Then it wouldn't work. You obviously need to validate the format first. And remove the first $seconds += partSwaddle
How would flipping the array help?Swaddle
No.. If HH is not present flipping the array will result in the seconds getting treated as hours.Swaddle

© 2022 - 2024 — McMap. All rights reserved.