Webページに時計を追加する必要があります。時計はサーバーと同期する必要がありますが、ページは複数のPCで24時間年中無休で開かれるため、サーバーを常にチェックする必要はありません。サーバーから時刻を取得し、システムクロックを使用して更新を維持し、15分ごとにサーバーをチェックして同期を維持する方法はありますか?
8 に答える
私が以前にこれについて行った方法は次のとおりです。
- サーバーから時間をかけて、
- クライアントから時間を取ってください(すぐに)
- オフセットを取得します。
- 時計を表示するときは、クライアントの現在の時刻にオフセットを適用します。
これはサーバーから時々更新する必要があるだけです。
ただし、解決しなければならない問題は、サーバーから時刻を取得するように要求する際に、クライアントの時刻を取得する前に遅延が発生することです。おそらく、ajaxリクエストを使用してサーバー時間だけを取得し、それによってオーバーヘッドやネットワークラグなどを削減することで、これを最小限に抑えることができます。
+Date.now()
Unixエポック以降のローカルmsを返します。それで:
- サーバーから時間を取得する
- サーバー時間と現地時間の差を計算する
- 現地時間を取得し、差を使用して調整することにより、(表示しているものに応じて)1秒または1分ごとに時計を更新します
- 15分ごとに違いを更新します。
またはそのようなもの。
これが前半を示すフィドルです:
var serverTime = 1310127993162; //this would come from the server obviously
var localTime = +Date.now();
var timeDiff = serverTime - localTime;
setInterval(function () {
console.log(+Date.now() + timeDiff);
}, 1000);
Server Time: <input type="text" id="clock" value="" size='8'>
<script type="text/javascript">
var serverTime = <?php echo time() * 1000; ?>; //this would come from the server
var localTime = +Date.now();
var timeDiff = serverTime - localTime;
setInterval(function () {
var realtime = +Date.now() + timeDiff;
var date = new Date(realtime);
// hours part from the timestamp
var hours = date.getHours();
// minutes part from the timestamp
var minutes = date.getMinutes();
// seconds part from the timestamp
var seconds = date.getSeconds();
// will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes + ':' + seconds;
$('#clock').attr('value',formattedTime); <-- input id=clock
}, 1000);
</script>
1つのアイデアは、要求されたときにページの日時に応答することです。お気に入り:
<html>
your serveside codes,
<script>
var serverdatetime = new Date("<%=Datetime.Now%>");
//use serverdatetime and update it after 15 mins.
// you can use ajax to get datetime
setTimeout(function(){
$.ajax({
url: 'http://yourhost.com/getdate',
success: function( data ) {
// use data and update serverdatetime
}
});},54000);
</script>
server codes
</html>
**注:これはアイデアのみであり、コードが機能しない可能性があります
ページが読み込まれるたびにサーバーから現在の時刻を取得できるため、最初の読み込みでも現在のサーバー時刻がわかります。その後、1秒ごとにチェックするように設定されたページでjavascriptタイマーを使用すると、サーバーと同期して時計が実質的に機能するようになります。提案されているようにオフセットを適用することもできますが、ポストバック中にラグがあるため、お勧めしません。
Ajaxリクエストは興味深いオプションかもしれません。
疑問がある場合は、この時計もチェックしてください。
また、W3Schoolsはjavascriptの優れたリファレンスです。
<script>
var ctoday = <?php echo time() * 1000 ?>;
setInterval(function() {ctoday += 1000;},1000);
function startTime() {
var today = new Date(ctoday);
var montharray = new Array("Jan","Feb","Mar","Abr","May","Jun","Jul","Ogu","Sep","Oct","Nov","Des");
var h = today.getHours();
var ampm = h >= 12 ? 'PM' : 'AM';
h = h % 12;
h = h ? h : 12;
var m = today.getMinutes();
var s = today.getSeconds();
h = checkTime(h);
m = checkTime(m);
s = checkTime(s);
document.getElementById('txt').innerHTML =
checkTime(today.getDate())+" "+montharray[today.getMonth()]+" "+today.getFullYear() + " (" + ampm +" " + h + ":" + m + ":" + s +")";
setTimeout(startTime, 1000);
}
function checkTime(i) {
if (i < 10) {i = "0" + i};
return i;
}
</script>
<body onLoad="startTime();">
<span id="txt"></span>
</body>
- PHPを使用してサーバー時間を保持する変数を作成します。
- 1秒ごとにタイムスタンプに1000を追加します(1000 = 1秒)。
- 今時間を取得します。
- 次に、タイムスタンプを増やして新しい日付をインスタンス化します。
- 月の名前を作成します
- AMまたはPMを検出します。
- 時間形式を24から12に変換します
- 議事録を取得する
- 秒を取得する
- 10時間未満の場合は、0件のリードを追加します
- 10分未満の場合は0リードを追加します
- 10秒未満の場合は0リードを追加します
- ここで、すべての日時を連結し、ID「txt」を使用してDOM要素に配置します。
- 1秒ごとに機能を繰り返す
- 関数は0を加算して、10未満の数値を導きます
以下のコードを試してください:
var m_serverDateTime;
var currentOffsetedTime;
var diffMilliseconds;
$(document).ready(function () {
m_serverDateTime = getServerDateTime();/*your function to get server time
by ajax call */
diffMilliseconds = GetServerTimeDifference(m_serverDateTime);
});
function GetServerTimeDifference(serverdatetime) {
var fromdate = new Date();
var todate = new Date(serverdatetime);
var localdiffMilliseconds = todate - fromdate;
return localdiffMilliseconds;
}
setInterval(function () {
//var currentOffsetedTime = new Date().setMinutes(diffMinutes);
currentOffsetedTime = new Date();
currentOffsetedTime.setMilliseconds(diffMilliseconds);
$('#lblTimer').text(format(currentOffsetedTime, 'dd/MM/yyyy HH:mm'));
}, 1000);
サーバーから1回の日時を取得します。ロード時にこのメソッドを呼び出し、momentsjsを使用して日付をフォーマットします。
var timeMiliSecond = new Date(serverTime).getTime();
callRepeatedly() {
setTimeout(() => {
timeMiliSecond = timeMiliSecond+1000;
serverTime=moment(newDate(timeMiliSecond)).format('MM-DD-YYYY HH:mm:ss');
this.callRepeatedly();
}, 1000)
}