kkapsner
Super Moderator
Das window.setTimeout() würde ich immer so laufen lassen, dass es kurz nach der neuen Sekunde feuert. Das ist ja nicht schwer auszurechnen, da man die aktuelle Zeit ja sowieso schon ausgelesen hat. Wenn es dann mal etwas daneben liegt, wird das beim nächsten Mal korrigiert.
In etwas so: Serverzeit
In etwas so: Serverzeit
Code:
<?php
if (array_key_exists("getTime", $_GET)){
date_default_timezone_set("Europe/Berlin");
$utime = microtime(true);
$milliseconds = $utime - floor($utime);
$ret = array(
"dateHour" => strftime("%d.%m.%Y %H:"),
"milliseconds" => (strftime("%M")*60 + strftime("%S") + $milliseconds)*1000
);
echo json_encode($ret);
die();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Fenstertitel</title>
<script type="text/javascript" src="//kkjs.kkapsner.de/modules/kkjs.load.js?modules=sprintf"></script>
<style type="text/css"></style>
</head>
<body>
Server: <span id="server"><span id="serverDateHour"></span><span id="serverRest"></span></span>
<br>
Client: <span id="client"></span>
<script type="text/javascript">
function refreshServerTime(){
var requestTime = Date.now();
var offset = 0;
var hours = 0;
kkjs.ajax.advanced({
url: "?getTime",
onload: function(txt){
var requestDuration = Date.now() - requestTime;
var data = JSON.parse(txt);
kkjs.$("serverDateHour").innerHTML = data.dateHour;
var now = new Date();
var serverNow = new Date();
serverNow.setMinutes(0);
serverNow.setSeconds(0);
serverNow.setMilliseconds(data.milliseconds + requestDuration/2);
offset = serverNow - now;
hours = serverNow.getHours()
refreshServerTimePartial();
}
});
function refreshServerTimePartial(){
var now = new Date();
now.setTime(now.getTime() + offset);
kkjs.$("serverRest").innerHTML = kkjs.sprintf(
"%02d:%02d",
now.getMinutes(),
now.getSeconds()
);
if (now.getHours() !== hours){
refreshServerTime();
}
else {
window.setTimeout(
refreshServerTimePartial,
1001 - now.getMilliseconds()
);
}
}
}
function refreshClientTime(){
var now = new Date();
kkjs.$("client").innerHTML = kkjs.sprintf(
"%02d.%02d.%04d %02d:%02d:%02d",
now.getDate(),
now.getMonth() + 1,
now.getFullYear(),
now.getHours(),
now.getMinutes(),
now.getSeconds()
);
window.setTimeout(
refreshClientTime,
1001 - now.getMilliseconds()
);
}
refreshServerTime();
refreshClientTime();
</script>
</body>
</html>
Zuletzt bearbeitet: