Як перетворити час у форматі HH:MM:SSна плоске число секунд?
PS Час іноді може бути MM:SSлише у форматі .
Відповіді:
Не потрібно 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;
$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; Має бути$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
Я думаю, що найпростішим методом було б використання 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;
Функція date_parse()також може використовуватися для аналізу дати та часу:
$time = '21:30:10';
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];
Якщо ви будете аналізувати формат за 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;
}
strtotime()не дозволяє годинам перевищувати 24 - використання 25 або вище поверне значення "false".
array_reverseвибухає, :викликаючи ще одну поїздку через foreachта іншу pow(так що обидва hh: mm І hh: mm: ss працюють без модифікації функції), - це геніальний штрих. Код par excellence. Навряд чи я можу уявити більш ефективний приклад. Дякую!
$time = 00:06:00;
$timeInSeconds = strtotime($time) - strtotime('TODAY');
Спробуйте це:
$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;
За допомогою strtotimeфункції можна повернути кількість секунд від today 00:00:00.
$seconds= strtotime($time) - strtotime('00:00:00');
<?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];