Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как в PHP сложить время?

Как в PHP сложить время?


     29.06.2025    Все вопросы » Общие вопросы по PHP    180

вопрос
Здравствуйте, Господа...

Подскажите пожалуйста, как в PHP сложить продолжительность (время)?

1:05:39
0:55:39
0:15:09
0:36:20


Пытаюсь сделать скрипт, который бы мне облегчил работу (чтоб самому не считать)...

Я придумал колхозный "трёхэтажный" вариант, но знаю, что можно сделать гораздо проще...

Прошу помочь "недоучке"...

Ответа пока нет


12 комментариев

byroot
Юзер

byroot - 30 июня 2025 20:42 -

ответ ии:
<?php
function sumTimeDurations(array $times): string
{
    $totalSeconds = 0;
    
    foreach ($times as $time) {
        list($hours, $minutes, $seconds) = explode(':', $time);
        $totalSeconds += $hours * 3600 + $minutes * 60 + $seconds;
    }
    
    $hours = floor($totalSeconds / 3600);
    $minutes = floor(($totalSeconds % 3600) / 60);
    $seconds = $totalSeconds % 60;
    
    return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
}

// Ваши примеры времени
$times = [
    '1:05:39',
    '0:55:39',
    '0:15:09',
    '0:36:20'
];

$result = sumTimeDurations($times);
echo $result; // Выведет: 02:52:47
?>

1:05:39 = 3939 секунд
0:55:39 = 3339 секунд
0:15:09 = 909 секунд
0:36:20 = 2180 секунд
-------------------
Сумма: 10367 секунд = 2 часа 52 минуты 47 секунд

NONSENS
Юзер

NONSENS - 30 июня 2025 22:13 -

У ИИ ещё более колхозный подход.

В PHP есть встроенные функции для работы со временем/датой, просто я с ними не умею работать, а поиск в гугле выдаёт слишком навороченые примеры (с классами, днями, неделями, годами, текущим временем и с "временем с начала отсчёта").

Прошу пример использования такой функции со сложением всего друх продолжительностей - а дальше сам додумаю и выложу готовый скрипт... (типа '1:05:39' + '0:15:09')

byroot
Юзер

byroot - 30 июня 2025 22:29 -

почему колхозный? Всё сначала переводится в секунды, складывается, и потом выводится в нужно варианте. Можешь так преобразовать:

    $timeParts = explode(':', $duration, 3);
    $hours = (int)($timeParts[0] ?? 0);
    $mins = (int)($timeParts[1] ?? 0);
    $secs = (int)($timeParts[2] ?? 0);
    $durationInSeconds = ($hours * 3600) + ($mins * 60) + $secs;

здесь так же всё переводится в секунды, далее нужно будет складывать секунды и выводить в нужном виде их.

NONSENS
Юзер

NONSENS - 1 июля 2025 22:08 -

Потому что есть нормальная функция работы со временем - без разбиения на части, без умножений и делений.

Будет приходить POST'ом любое колличество "продолжительностей" - переводим в массив по переносу строки.

Делаем "стартовое" время $time = '00:00:00'

Счетаем колличество елеменов массива (для цикла)

Дальше запускаем цикл с простой встроенной функцией: $time = $time + елемент массива

По окончанию выводим готовый $time

Требуется понять как плюсануть '00:00:00' + '01:01:01' с помощью готовой встроенной функции ратоты со временем...

TeraMoune
Эксперт

TeraMoune - 1 июля 2025 22:43 -

Потому что есть нормальная функция работы со временем - без разбиения на части, без умножений и делений.

Нету таких функций, в php есть функции работы с датой и временем (вместе) но отдельно делать с временем что-то таких функций нету.

byroot
Юзер

byroot - 2 июля 2025 06:40 -

Либо иди дальше школу заканчивай, или читай по PHP инфу лучше, чтоб не придумывать в голове то, чего нет фактически и не было никогда!

NONSENS
Юзер

NONSENS - 2 июля 2025 07:08 -

"Нет таких функций...", "А давайте нагородим функций и классов...", "А давайте спросим ИИ..."

Держите, Господа:


$res = strtotime('0:13:00') + strtotime('1:00:25') -strtotime("00:00:00");

echo date('H:i:s',$res);

TeraMoune
Эксперт

TeraMoune - 2 июля 2025 20:04 -

"А давайте нагородим функций и классов..."

Мне ваш вариант не очень нравиться. Он не завершенный и так или иначе вам потребуется городить функцию.
Он хорош может если надо пару раз такое провернуть с парой данных. Но с большим количеством данных потребуется функция.

На практике же использовать может быть неудобно.

Так что нет никакой разницы какая функция будет, по итогу чаще всего так бывает, что функцию таки придётся написать.

NONSENS
Юзер

NONSENS - 3 июля 2025 15:39 -

Естественно это не готовый вариант "скрипта", а лишь пример: как "просто" сложить время.

Фунции нужны только, если мы планируем их вызывать. Писать же функцию и сразу её вызывать - это какой-то абсурд. В случае, когда нам нужно много раз выполнять одно и то же, использвание функции - идеальный вариант. В данном же случае требуется единоразовое выполнение в цикле - сложит хоть миллион "продолжительностей".

Классы же в "неумелых" руках - это потенциальная бомба: пока искал ответ на свой вопрос видел пример с клонирванием класса - так и всю память можно забить...

TeraMoune
Эксперт

TeraMoune - 3 июля 2025 22:55 -

Фунции нужны только, если мы планируем их вызывать.

Еще для эстетики и красоты кода. Даже если вызов функции будет один раз, разница использования одной функции вызова красивей смотрится нежели по месту писать несколько строк.

byroot
Юзер

byroot - 2 июля 2025 19:29 -

это единичный случай, лучше использовать функцию...

NONSENS
Юзер

NONSENS - 4 июля 2025 10:40 -

Вот готовый скрипт-шаблон - создаём файл times.php и пихаем в него код, сохраняем. Пихаем в верхее поле продолжительности с переносом стоки, нажимаем кнопку "Отправить" - получаем результат в нижнем поле.


<html>
	<head>
		<title>Время</title>
		<link rel="shortcut icon" href="/favicon.ico" />
	</head>
<body>
<?php
			
	if($_SERVER[REQUEST_METHOD]=='POST'){ // Если форма отравлялась (был метод POST) - тогда выполняй, если GET - не выполняй
		
		$br = "
"; // делаем переменную с переносом
		
		$times = trim($_POST['time']); // приход Продолжительностей
		
		$res = '00:00:00';
			
		$array_times = explode($br, $times);
			
		for($i=0,$cnt=count($array_times);$i<$cnt;$i++){
			
			$res = strtotime($res) + strtotime($array_times[$i]) -strtotime("00:00:00");
			$res = date('G:i:s',$res);
			
			}
	}
?>

<style>
	html,body,TEXTAREA {font-size: 14pt;
	font-family: 'Times New Roman';}
	body {background-color: #ADD8E6; text-align: center;}
	TEXTAREA {background-color: #DCDCDC;}
	#post {
	width: 750px;
	height: 200px;
	padding-left: 5px;
		} 
	#html{
	width: 750px;
	height: 200px;
		}
	.x1280{
	margin-left: 265px;
	width: 1280px;
	}
	input[type="text"] {
	   border: 1px solid #000;
	   background: #DCDCDC !important;
	   width: 750px;
	   font-size: 14pt;
	   font-family: 'Times New Roman';
	   padding-left: 5px;
		}
	#submit,#copy {
	font-size: 22pt;
	margin-top: 10px;
	}
	HR {height: 4px; COLOR: #000000; background-color: #000000; noshade;}
	.leviy{
	font-size: 14pt;
	width: 300px;
	}
	.praviy{
	font-size: 14pt;
	padding-left: 10px;
	}
	.praviydop{
	font-size: 14pt;
	padding-left: 10px;
	
	}
	
	.praviydop input[type="text"] {
	border: 1px solid #0000CD;
	background: #c9c9c9 !important;
		}
	#short{
	width: 400px;
	}
	#postlinks{
	width: 750px;
	height: 250px;
	padding-left: 5px;
	}
	
	dopolnitelno {
	color: #0000CD;
		}

</style>

<form action="times.php" method='post'>
<div class="x1280">
<br><br><br><br>
<table cellpadding="0" cellspacing="0" border="0" width="100%" align="center" ><tr>
<td align="right" class="leviy">
<B>Время:</B>
</td>

<td class="praviy">
<textarea name='time' id="postlinks"><?php
		echo $times;
		?></textarea>
</td></tr></table>
</div>
<br>
		<input type='submit' value="Отправить" id="submit">
	</form>
	
<br><br><B>Готовое Время:</B><br>
<textarea id="html" name="html"><?php
		
		echo $res;

		?></textarea><br>
<input type="button" value="Копировать" id="copy" onclick="copy_to_clipboard('html');">

<script>
function copy_to_clipboard(id)
{
    document.getElementById(id).select();
    document.execCommand('copy');
}
</script>
<br><br><br>

</body>
</html>

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх