2015-06-07 47 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

你的意思是什麼?你在尋找什麼準確性?計算機上的時鐘永遠不會準確,它們會漂移。 –