Як перетворити час у форматі 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];