Nemám rád, když se na stránkách samoúčelně zobrazují prvky, které s obsahem nemají nic společného. Dobrou ukázkou jsou JavaScriptové hodiny ukazující čas na počítači uživatele.
Docela něco jiného ale je, když se na stránkách zobrazují hodiny ukazující čas na straně serveru. To se může hodit třeba u obchodu s působností ve více časových pásmech a dostupností telefonické podpory jen v určitém čase. Nebo na stránkách banky jako rozhodný údaj pro provádění některých pokynů (např. expresních plateb možných jen v určitém časovém rozpětí).
Pro získání serverového času můžeme použít např. funkci date, pro jeho aktualizaci budeme potřebovat JavaScript:
<div id="local-time"><?php echo date("H:i:s"); ?></div> <script type="text/javascript"> var time_offset = 1000 * <?php echo time(); ?> - (new Date()).getTime(); window.setInterval(function () { var local_time = new Date(); local_time.setTime(local_time.getTime() + time_offset); var min = local_time.getMinutes(); var sec = local_time.getSeconds(); document.getElementById('local-time').innerHTML = local_time.getHours() + ':' + (min < 10 ? '0' : '') + min + ':' + (sec < 10 ? '0' : '') + sec; }, 1000); </script>
Na první pohled mnohem jednodušší řešení by bylo si na začátku do proměnné uložit serverový čas a v sekundových intervalech k němu přičítat jednu sekundu. Toto řešení by však narazilo v momentě, kdy by uživatel počítač uspal – po probuzení by se na stránce zobrazoval starý čas. To je důvod, proč se při každém zavolání funkce poměrně nákladně zjišťuje aktuální čas.
Pokud si skript spustíte na svém počítači, tak si nejspíš všimnete toho, že je čas o chvilku zpožděný. Důvod je ten, že se nepočítá se zlomky sekund. Obvykle to nevadí, ale pokud by to někomu přece jen vadilo, zde je řešení:
<div id="local-time"><?php echo date("H:i:s"); ?></div> <script type="text/javascript"> var time_server = 1000 * <?php echo microtime(true); ?>; var time_offset = time_server - (new Date()).getTime(); function time_set() { var local_time = new Date(); local_time.setTime(local_time.getTime() + time_offset); var min = local_time.getMinutes(); var sec = local_time.getSeconds(); document.getElementById('local-time').innerHTML = local_time.getHours() + ':' + (min < 10 ? '0' : '') + min + ':' + (sec < 10 ? '0' : '') + sec; } window.setTimeout(function () { window.setInterval(time_set, 1000); time_set(); }, 1000 - time_server % 1000); </script>
Kromě použití funkce microtime je důležité také to, že první aktualizace času se neprovede až za vteřinu, ale za její část na základě serverového času.
Diskuse je zrušena z důvodu spamu.