Autor Zpráva
danhill
Profil
Ahoj, dělám si pomůcku na počítání odpracovaných hodin a nějak se mi to nedaří, tak jsem se přišel zeptat jak na to ...
Potřebuji odečíst dva a více časy od sebe a nefunguje mi to.
V první chvíli mám tohle:
$start_microtime = strtotime($select_actions_day['datetime']); //2016-09-17 10:34:24 = 1474101264
$end_microtime = strtotime($select_actions_day['datetime']); //2016-09-17 15:34:31 = 1474119271
Potřebuji zjistit, kolik hodin je rozdíl mezi těmito časy a tak udělám jednoduše:
$work_microtime = $end_microtime - $start_microtime;
$work_time = date( 'H:i:s',$work_micortime); //převod mictortime

A výsledek? Nic moc.
echo $work_microtime; = 18007 //což je správně
echo $work_time; = 01:00:00 //což je hloupost. Má být 05:00:00

Děkuji moc předem za rady ...
Až vyřeším tohle, musím do toho implemetovat ještě pauzu ... Tedy předpokládám,že to princip bude stejný, jen pak upravím vzorec:
$work_micortime = $end_time - $start_time - ($end_pause_time-$start_pause_time);
Alphard
Profil
Funce date je určena pro práci s reálným datem (timestamp počítaný od určitého historického okamžiku), ne s intervalem, proto také zohledňuje časová pásma. Ta 1:00:00 naznačuje dost divné časové pásmo, ale tak to už je jedno...
V tomto případě bude fungovat funkce gmdate(), ta pracuje s UTC, takže vrátí opravdu 5 hodin. Ale dej si pozor na delší intervaly, jestli přesáhneš 24 hodin, vynuluje se počítadlo (bude to brát jako další den). Pak by bylo lepší napsat si tu funkci ručně, postupným dělením, je to na 5 řádků.
danhill
Profil
Hm, tak tomu teda uplně nerozumím.
Mě je přece jedno jaké je časové pásmo. Naopak jsou to přeci nereálná data, které se mají odečíst.
Co jsem koukal na tu funkci gmdate jsem z toho dost vedle ... jsou to velmi složité funkce a nějak tomu nerozumím...
Jediné,čemu rozumím je ta poslední věta - přechody přes 24 hodin, to ano, to možná v tomto případě ani nebudu řešit a když tak až v dalším kroku. Já bych teď jen rád pochopil,proč nejsem schopen odečíct dva časy.
Přitom když zkusím třeba:
$test = strtotime("$select_actions_day['datetime'] +3 days");
Tak to normálně regulerně 3dny krásně přičte ...
danhill
Profil
Tohle mi prostě nefunguje ... Vyřešil jsem to na úrovní MYSQL , potrápil se s dotazem a přehodnotil strukturu tabulky a chodí :) ...
Každopádně děkuji za reakci ...
TomášK
Profil
Jsou dvě různé... veličiny (jak to nazvat?). První je timestamp, počet vteřin od 1.1.1970 UTC. Hodí se pro měření intervalů, nezohledňuje lokální timezone, různé posuny pro korekci času. Mám jistotu, že tam za 10 vteřin bude o 10 vteřin víc. Druhá veličina je čas, den, měsíc, rok. Je potřeba uvažovat časové pásmo, za 10 vteřin může být na hodinách o 9 vteřin víc nebo o hodinu míň (přestupná sekunda/rok).
Funkce date převádí timestamp (první veličinu) na čas (druhou veličinu). Což není dobrý nápad, počítáš-li s intervalem a potřebuješ se vyhnout časovým zónám a věcem okolo. gmdate() ošetří časové zóny, ale přestupné sekundy už ne. Je lepší pracovat s timestampem a pro převod na minuty/hodiny to vydělit 60, jak psal Alphard.
V tom příkladu jsou překlepy micortime vs microtime, nebyl problém tam?
Davex
Profil
danhill:
Tohle mi prostě nefunguje ...
Protože jsi použil pro tento případ nevhodnou funkci date(), která vrací výsledek přepočítaný na lokální čas (podle časové zóny nastavené v konfiguraci PHP). Pro časový rozdíl by zřejmě bylo nejlepší použít metodu diff třídy DateTime.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: