Skip to content

Instantly share code, notes, and snippets.

@uzbekdev1
Forked from ethaizone/server_time_sync.js
Created June 8, 2019 15:38
Show Gist options
  • Save uzbekdev1/034e084ed2526b38b6ad72b82a5506e9 to your computer and use it in GitHub Desktop.
Save uzbekdev1/034e084ed2526b38b6ad72b82a5506e9 to your computer and use it in GitHub Desktop.
Sync server time to client browser with JS. Implement follow Network Time Protocol.
// Thanks http://stackoverflow.com/questions/1638337/the-best-way-to-synchronize-client-side-javascript-clock-with-server-date
var serverTimeOffset = false;
function getServerTime(callback) {
if (serverTimeOffset === false) {
var scripts = document.getElementsByTagName("script"),
URL = scripts[scripts.length - 1].src;
var clientTimestamp = Date.parse(new Date().toUTCString());
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("HEAD", URL + "?noCache=" + Date.now(), true);
xmlhttp.onload = function(){
if (xmlhttp.readyState === 4) {
if (xmlhttp.status === 200) {
var serverDateStr = xmlhttp.getResponseHeader('Date');
var serverTimestamp = Date.parse(new Date(Date.parse(serverDateStr)).toUTCString());
var serverClientRequestDiffTime = serverTimestamp - clientTimestamp;
var nowTimeStamp = Date.parse(new Date().toUTCString());
var serverClientResponseDiffTime = nowTimeStamp - serverTimestamp;
var responseTime = (serverClientRequestDiffTime - nowTimeStamp + clientTimestamp - serverClientResponseDiffTime )/2;
serverTimeOffset = (serverClientResponseDiffTime - responseTime);
var date = new Date();
date.setTime(date.getTime() + serverTimeOffset);
callback.call(null, date);
} else {
console.error(xmlhttp.statusText);
}
}
};
xmlhttp.send(null);
} else {
var date = new Date();
date.setTime(date.getTime() + serverTimeOffset);
callback.call(null, date);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment