Перетворити час у форматі HH: MM: SS лише у секунди?


75

Як перетворити час у форматі HH:MM:SSна плоске число секунд?

PS Час іноді може бути MM:SSлише у форматі .

Відповіді:


136

Не потрібно explodeнічого:

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

І якщо ви не хочете використовувати регулярні вирази:

$str_time = "2:50";

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

$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;

Солодкий розчин. Але чи не зламається це, якщо HH відсутній?
simme

Просто виправив, щоб не було.
Tim Cooper

1
Використовуючи часові функції, мені довелося возитися з часовими поясами, щоб все було правильно, але це набагато простіше.
datagutten

Помилка в останньому рядку: $time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; Має бути$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
Ендрю Лазар

105

Я думаю, що найпростішим методом було б використання strtotime()функції:

$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


Функція date_parse()також може використовуватися для аналізу дати та часу:

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

demo


Якщо ви будете аналізувати формат за MM:SSдопомогою strtotime()або date_parse()він не вдасться ( date_parse()використовується в strtotime()та DateTime), тому що при введенні формату, як xx:yyпарсер, передбачається, що він є, HH:MMа ні MM:SS. Я б запропонував перевірити формат і додати, 00:якщо у вас є MM:SS.

demo strtotime() demo date_parse()


Якщо у вас є години більше 24, тоді ви можете використовувати наступну функцію (вона буде працювати MM:SSі HH:MM:SSформатувати):

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

demo


1
strtotime()не дозволяє годинам перевищувати 24 - використання 25 або вище поверне значення "false".
Свен

1
Ваша третя відповідь протягом 24 годин - це саме те, що мені потрібно. І, що array_reverseвибухає, :викликаючи ще одну поїздку через foreachта іншу pow(так що обидва hh: mm І hh: mm: ss працюють без модифікації функції), - це геніальний штрих. Код par excellence. Навряд чи я можу уявити більш ефективний приклад. Дякую!
FirstFraktal

@ Glavić Дещо допомагає мені теж
Абдулла Нілам

1
Я просто подивився першу відповідь і подумав, а що, якби я використав епоху Unix ... голосуй за мене!
Вихід

1
Третій варіант працює для кожного дійсного формату, який я міг би надати йому. 👍
Synetech


8

У псевдокоді:

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

6
Як він писав, це псевдокод. "Прикиньте код", щоб пояснити, як щось можна зробити.
simme

Не має значення, псевдокод це чи ні, оскільки питання вимагає підтримки формату MM: SS, чого у цій відповіді немає.
Synetech

5

Спробуйте це:

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

Я це люблю! $ time = "01: 23: 54: 21: 30: 10" дає мені відповідь 1087421410 секунд.
Роджер Галлібуртон,

2
Спробуй зараз. Звичайно, ви можете передати щось на зразок "898989: 8989898: 899899", але я припускаю, що основні перевірки будуть здійснені за час, введений до того, як код буде досягнутий для обчислення секунд.
Chandu

5

За допомогою strtotimeфункції можна повернути кількість секунд від today 00:00:00.

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

1
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду. Будь ласка, також намагайтеся не переповнювати свій код пояснювальними коментарями, це зменшує читабельність як коду, так і пояснень!
Філнор

2

Простий

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

0
<?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];

Що, якби було лише 32:32 без години?
Ryan

1
Тоді це не спрацювало б. Очевидно, спочатку потрібно перевірити формат. І видалити перші $ секунд + = частина
simme

Як допомогло б перегортання масиву?
simme

Ні .. Якщо HH відсутній, перегортання масиву призведе до того, що секунди будуть розглядатися як години.
simme

0
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.