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.

## Solution 1

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;
``````

## Solution 2

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`.

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

## Solution 3

``````    \$time = 00:06:00;
\$timeInSeconds = strtotime(\$time) - strtotime('TODAY');
``````

## Solution 4

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

``````\$seconds= strtotime(\$time) - strtotime('00:00:00');
``````

## Solution 5

In pseudocode:

``````split it by colon
seconds = 3600 * HH + 60 * MM + SS
``````

## Solution 6

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;
``````

## Solution 7

Simple

``````function timeToSeconds(\$time)
{
\$timeExploded = explode(':', \$time);
if (isset(\$timeExploded)) {
return \$timeExploded * 3600 + \$timeExploded * 60 + \$timeExploded;
}
return \$timeExploded * 3600 + \$timeExploded * 60;
}
``````

## Solution 8

``````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
``````

## Solution 9

``````<?php
\$time    = '21:32:32';
\$seconds = 0;
\$parts   = explode(':', \$time);

if (count(\$parts) > 2) {
\$seconds += \$parts * 3600;
}
\$seconds += \$parts * 60;
\$seconds += \$parts;
``````