[Megoldva] PHP idők összeadása és kivonása

Azzal a problémával szembesültem, hogy időket kellene összeadnom, illetve kivonnom egymásból és kerestem de nem találtam megfelelő függvényeket. Az idő összeadás még csak-csak, de a kivonás már nehézkesebb ügy.

A két string amiből szeretnék normális időt kiíratni:


$TIME1="16:15:25";
$TIME2="14:44:35";

Összeadás után: 31:00:00
Kivonás után: 1:30:50

Van erre valami gyors és értelmes megoldás vagy írjam meg magamnak. Egyébként nagyjából megírtam, de! nekem nem tetszik, bár működik :-) Lehet egy update-ben berakom ha nincs 10000%-os ötlete senkinek.

Dankesüni!

Update (a megoldások):


function TimePlus($time1,$time2) {
	list ($h1,$m1,$s1) = explode(":",$time1);
	list ($h2,$m2,$s2) = explode(":",$time2);
	$s = ($s1 + $s2) % 60; // Másodperc
	$m = ((($s1 + $s2) / 60 ) + $m1 + $m2 ) % 60; // Perc
	$h = (((($s1 + $s2) / 60 ) + $m1 + $m2 ) / 60 ) + $h1 + $h2; // Óra
	return sprintf("%d:%02d:%02d",$h,$m,$s);
}

function TimeMinus($time1,$time2) {
	date_default_timezone_set("Europe/Budapest");
	$d1 = date_create($time1);
	$d2 = date_create($time2);
	$interval = date_diff($d1, $d2);
	return (($d1 < $d2 )?"-":"").$interval->format('%h:%I:%S');
}

Hozzászólások

És ha strtotime-mal összeadod/kivonod őket, majd date-tel formázod?

date(j:G:i:s). Explodeolod kettőspont mentén és akkor az óra számítható úgy, hogy az óra = óra + napok szorozva 24.

Bocs, de nem tudok itt kódot írni, elég szar a MacBook billkiosztása, szokatlan.

Kicsit talán favágó, de nem tudom van-e egyszerűbb megoldás.

Na, másik gép. Szóval:


$TIME1 = strtotime($TIME1);
$TIME2 = strtotime($TIME2);

$timedifference = $TIME1-$TIME2;

$formattedtime = date(j:G:i:s, $timedifference);

$explodedtime = explode(":", $formattedtime);

$explodedtime[1] += $explodedtime[0]*24;
$temp[0] = $explodedtime[1];
$temp[1] = $explodedtime[2];
$temp[2] = $explodedtime[3];

$calculateddifference = implode(":", $temp);

Nem vagyok PHP mágus, szóval biztos lehet ezt szebben is. Meg nem is teszteltem.

"Nem vagyok PHP mágus, szóval biztos lehet ezt szebben is."

Nem biztos hogy szebb, de explode helyett lehetne külön date a 4 paraméter lekérésére, nem biztos, hogy lassabban futna le.

Egyébként lehetne használni valamilyen osztályt is, ott a DateTime és a DateInterval.

--
Don't be an Ubuntard!

Nem jó, de köszönöm a fáradozásod, viszont a kivonásra találtam kész megoldást:


date_default_timezone_set("UTC");
$datetime1 = date_create($TIME1);
$datetime2 = date_create($TIME2);
$interval = date_diff($datetime1, $datetime2);
echo (($datetime1 < $datetime2 )?"-":"").$interval->format('%h:%I:%S');

A timezone meghatározás kell ha nem szeretnék warningot. A végén a vizsgálat meg kirakja a negatív előjelet.

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

strtotime -al konvertáld unix timestamp-be, onnantól szabadon tudsz összeadni kivonogatni

Add össze nyugodtan, majd egyszerű maradékképzéssel alakítsd át:


$s = ($s1 + $s2) % 60; // Másodperc
$m = (($s1 + $s2)/60) + $m1 + $m2) % 60; // Perc
$h = (((($s1 + $s2)/60) + $m1 + $m2)/60) + $h1 + $h2) % 24; // Óra

--
http://sandor.czettner.hu
http://turaindex.hu


<?php
date_default_timezone_set('Europe/Budapest');
$TIME1 = "16:15:25";
$TIME2 = "14:44:35";

$do1 = new DateTime($TIME1);
$it = $do1->diff(new DateTime($TIME2));
echo PHP_EOL;
echo 'Kivonás után: ' . $it->h.':' . $it->i . ':' . $it->s.PHP_EOL;
echo 'Összeadás után: ' . $do1->add(new DateInterval('PT14H44M35S'))->format('H:i:s');
echo PHP_EOL;

Most hirtelen ez jutott eszembe. A DateInterval csak 5.3-as verzió felett létezik.


Kivonás után: 1:30:50
Összeadás után: 07:00:00

--------------
Sok ember hord Superman-pizsamát. Superman Chuck Norris-pizsamát hord.