就像Mr. Shiny and New 所说,您需要一个时间正确的服务器。它可以是您站点所在的服务器,也可以是其他以您可以阅读的格式发送正确时间的服务器。
如果您想在页面上多次使用日期,间隔一秒或多秒,您可能不想每次都从服务器获取时间,而是缓存差异并使用客户端时钟。如果是这种情况,这里是众多解决方案之一:
var MyDate = new function() {
this.offset = 0;
this.calibrate = function (UTC_msec) {
//Ignore if not a finite number
if (!isFinite(UTC_msec)) return;
// Calculate the difference between client and provided time
this.offset = UTC_msec - new Date().valueOf();
//If the difference is less than 60 sec, use the clients clock as is.
if (Math.abs(this.offset) < 60000) this.offset = 0;
}
this.now = function () {
var time = new Date();
time.setTime(this.offset + time.getTime());
return time;
}
}();
将它包含在您的页面中,并让您的服务器端脚本生成如下行:
MyDate.calibrate(1233189138181);
其中数字是自 1970 年 1 月 1 日以来的当前时间(以毫秒为单位)。您还可以使用您最喜欢的 AJAX 框架并让它调用上面的函数。或者您可以使用建议的解决方案JimmyP。我已经重写了 JimmyPs 解决方案以包含在我的解决方案中。只需将以下内容复制并粘贴到上述函数中即可:
this.calibrate_json = function (data) {
if (typeof data === "object") {
this.calibrate (new Date(data.datetime).valueOf() );
} else {
var script = document.createElement("script");
script.type="text/javascript";
script.src=(data||"http://json-time.appspot.com/time.json?tz=UTC") +
"&callback=MyDate.calibrate_json";
document.getElementsByTagName('head')[0].appendChild(script);
}
}
this.calibrate_json(); //request calibration with json
请注意,如果您从 MyDate 更改函数名称,则必须更新 this.calibrate_json 中 script.src 行中的回调em>。
解释:
Mydate.offset 是服务器时间和客户端时钟之间的当前偏移量,以毫秒为单位。
Mydate.calibrate(x); 是一个设置新偏移量的函数。它预计输入是自 1970 年 1 月 1 日以来的当前时间(以毫秒为单位)。如果服务器和客户端时钟之间的差异小于 60 秒,则将使用客户端时钟。
Mydate.now() 是一个返回具有当前校准时间的日期对象的函数。
Mydate.calibrate_json(data) 是一个函数,它可以将 url 带回返回 datetime 回复的资源,或者带当前时间的对象(用作回调)。如果未提供任何内容,它将使用默认 url 来获取时间。 url 必须有一个问号“?”在里面。
如何用当前时间每秒更新元素的简单示例:
setInterval(
function () {
var element = document.getElementById("time");
if (!element) return;
function lz(v) {
return v < 10 ? "0" + v : v;
}
var time = MyDate.now();
element.innerHTML = time.getFullYear() + "-" +
lz(time.getMonth() + 1) + "-" +
lz(time.getDate()) + " " +
lz(time.getHours()) + ":" +
lz(time.getMinutes()) + ":" +
lz(time.getSeconds())
;
},1000);