2015-06-07 49 views
0

我在同一台机器上运行JavaServlet并将其作为JavascriptApp运行。Javascript时间与Java时间不同

该servlet输出当前时间:

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    ServletOutputStream os = resp.getOutputStream(); 
    os.print("" + System.currentTimeMillis()); 
} 

的JS获取时间:

$.get("UserdataServlet", function(data) { 
      console.log("dy " + data); 
      console.log("my " + Date.now()); 
     }); 

和版画有时价值观是这样的:

dy 1433690185937 
my 1433690185935 

怎么可能呢? Servlet的时间是在JavaScript的Date.now()之前进行的?而且两者都在同一台机器上运行。

“我的1433690185935”应该始终大于或等于“dy 1433690185937”。但它怎么会变得更小

它是从浏览器的某种优化?

一些例子:

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691257707 
my 1433691257717 

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691258716 
my 1433691258719 

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691259700 
my 1433691259715 

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691260700 
my 1433691260720 

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691261700 
my 1433691261712 

GET http://localhost:8081/Planetserverlinux/UserdataServlet 
dy 1433691262704 
my 1433691262701 
+1

的区别这个扩展的讨论为2ms。所以,是的,在服务器,然后再运行JS代码。 1/500秒后。 :) –

+1

但“Date.now()”应该始终是geater或等于服务器时间...不少于 – wutzebaer

+0

你是对的。 Withouth知道实际上发生了什么,我会将其视为服务器机制。 –

回答

3

既然你在Windows机器上运行的Java调用来获取时间四舍五入到最接近的16毫秒。 Javascript调用不限于此限制。

有了这些知识,人们就很容易与其他人发生不同的,不同的事情。

参见SO约precision and accurracy of Java Time

+0

是否有可能在JS中获得正确的值? – wutzebaer

+0

还是你的意思是System.currentTimeMillis()已经四舍五入? – wutzebaer

+0

你的意思是什么?你在寻找什么准确性?计算机上的时钟永远不会准确,它们会漂移。 –