2016-11-11 90 views
0

或者只知道系統時鐘和服務器之間的偏移量?如果我的系統時鐘與服務器不同,因爲時區會發生什麼情況? 感謝是否可以通過Java中的NTP客戶端同步系統時鐘?

+0

OS時鐘應該由操作系統維護,而不是由您的Java代碼維護。如果您在運行不同時區的計算機之間進行客戶端/服務器通信,則應確保雙方同意所傳輸的日期值的格式,以避免發生時區問題。傳輸純時代毫秒(總是UTC),或者使用新的['Instant'](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html)或['ZonedDateTime '](https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html)類。 – Andreas

+0

請更具體一點:哪個客戶? Java標準API不支持設置系統時鐘,但可能有特定於平臺的實現可以設置系統時鐘。 (雖然你需要使用提升的特權運行Java,但它不會像沒有垃圾收集和JIT編譯來彌補時間的非Java實現那樣準確) –

+0

謝謝,我使用的客戶端是apache客戶端:https :與NTPUDPClient –

回答

0

Java沒有一個API來直接設置系統時鐘。這可以在Java類中調用的C/C++本地代碼中完成,但需要管理權限才能執行。

有一些Java庫,如Apache Commons Net的項目,可以計算出時鐘本地系統時鐘與遠程NTP服務器之間的偏移。這提供了用於計算偏移量的代碼,以不同步本地時鐘。要實際同步,建議使用NTP客戶端/服務器執行此操作。有NTP實現幾乎所有的平臺(在Windows,Mac,Linux等)

Java庫和NTP服務使用基於UTC這樣的時區設置無效倍。

實施例:

NTPUDPClient client = new NTPUDPClient(); 
client.open(); 
// use host name or IP address of target NTP server 
InetAddress hostAddr = InetAddress.getByName("pool.ntp.org"); 
TimeInfo info = client.getTime(hostAddr); 
info.computeDetails(); // compute offset/delay if not already done 
Long offsetValue = info.getOffset(); 
Long delayValue = info.getDelay(); 
String delay = (delayValue == null) ? "N/A" : delayValue.toString(); 
String offset = (offsetValue == null) ? "N/A" : offsetValue.toString(); 

System.out.println(" Roundtrip delay(ms)=" + delay 
       + ", clock offset(ms)=" + offset); // offset in ms 
client.close(); 

注意,本地時鐘偏移(或時間偏移)相對於本地時鐘,並根據該標準NTP方程NTP服務器的時鐘計算出的。

LocalClockOffset = ((ReceiveTimestamp - OriginateTimestamp) + 
          (TransmitTimestamp - DestinationTimestamp))/2 
相關問題