【问题标题】:Issue with synchronization server time on client JSP page客户端 JSP 页面上的同步服务器时间问题
【发布时间】:2014-08-20 14:53:36
【问题描述】:
在 JSP 页面上,我需要显示带有服务器时间的时钟。
我试过以下代码:
function startTime() {
var timeServer = ('<%= new Date().getTime()%>');
var timeLocal=new Date();
var millDiff = timeServer - timeLocal;
timeLocal.setMilliseconds(timeLocal.getMilliseconds() - millDiff);
document.getElementById('txt').innerHTML = timeLocal;
var t = setTimeout(function(){startTime()},500);
}
但页面显示我本地机器的时钟。
【问题讨论】:
标签:
java
javascript
jsp
datetime
client-server
【解决方案1】:
您的 Javascript 方法只会在第一次调用时起作用。之后,由于timeServer 是硬编码的(就客户端而言),您的millDiff 在随后对startTime() 的调用中将出错。就客户端而言,timeServer 的值是硬编码的,因为 JSP 脚本不会在客户端再次运行,因此每次调用 Javascript 函数时,<%= new Date().getTime()%> 的值都保持不变,从而导致随着时间的推移,timeServer 和当前客户端时间之间的差异会更大。
您应该将millDiff 设为全局变量,并且您的millDiff 应该始终是JSP 运行时间与Javascript 函数首次 执行时间之间的毫秒差值。你不应该每次都重置它。
var m_millDiff = 0;
function startTime() {
var timeServer = ('<%= new Date().getTime()%>');
var timeLocal=new Date();
if(m_millDiff==0)
{
m_millDiff = timeServer - timeLocal;
}
timeLocal.setMilliseconds(timeLocal.getMilliseconds() - m_millDiff);
document.getElementById('txt').innerHTML = timeLocal;
var t = setTimeout(function(){startTime()},500);
}
反正就是这样。代码可能仍然不完美,但这是基本问题。
【解决方案2】:
您可以使用以下代码来做到这一点
在你想显示服务器时间的地方添加一个标签
<strong>Server Time : </strong><label id="timelable"></label>
然后在body标签里面的jsp末尾添加如下java脚本代码
<script type="text/javascript">
var myVar = setInterval(function(){ myTimer() }, 1000);
var jsVar= <%=java.util.Calendar.getInstance().getTimeInMillis()%>;
var timeZoneOffset=<%=java.util.TimeZone.getDefault().getOffset(System.currentTimeMillis())%>;
jsVar=jsVar+timeZoneOffset;
function myTimer() {
jsVar=jsVar+1000;
var d = new Date(jsVar);
var t=d.toUTCString();
document.getElementById("timelable").innerHTML = t;
}
</script>
现在就是这样,您将看到在您的 jsp 中运行的服务器时间。