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');
}
- 3587 megtekintés
Hozzászólások
http://php.net/manual/en/function.strtotime.php
Pont most kellett nekem is.
- A hozzászóláshoz be kell jelentkezni
Az a bajom ezzel, ha strtotime-mal adok össze időket akkor bizony ugrik a nap is én meg azt nem szeretném, a fenti példámban nem 31:00:00-át ad vissza hanem 07:00:00-át, tehát másnap reggelt számol.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
WTF?
--
http://www.buster.hu "A" számlázó
--
- A hozzászóláshoz be kell jelentkezni
Mutatsz egy kibeba egyszerű példát a fenti két string összeadására?
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
"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!
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Min halálozott el az enyém? Bár inkább megnézem majd, ha van egy kis időm, mindig tanul az ember.
- A hozzászóláshoz be kell jelentkezni
Nem elhalálozott hanem nem jól számolt.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
strtotime -al konvertáld unix timestamp-be, onnantól szabadon tudsz összeadni kivonogatni
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ez a megoldás _majdnem_ tökéletes (lehagytál 2 nyitó zárójelet :-)) és a % 24 nekem nem kell mert összeadom és 35 vagy akár 176 óra is kijöhet. Egyébként hibátlan.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
<?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.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, viszont összeadás után a 07:00:00 helyett nekem 31:00:00 kell, a cél napi órák összeszámolása és havi összesítés.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni