0
或者只知道系統時鐘和服務器之間的偏移量?如果我的系統時鐘與服務器不同,因爲時區會發生什麼情況? 感謝是否可以通過Java中的NTP客戶端同步系統時鐘?
或者只知道系統時鐘和服務器之間的偏移量?如果我的系統時鐘與服務器不同,因爲時區會發生什麼情況? 感謝是否可以通過Java中的NTP客戶端同步系統時鐘?
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
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
請更具體一點:哪個客戶? Java標準API不支持設置系統時鐘,但可能有特定於平臺的實現可以設置系統時鐘。 (雖然你需要使用提升的特權運行Java,但它不會像沒有垃圾收集和JIT編譯來彌補時間的非Java實現那樣準確) –
謝謝,我使用的客戶端是apache客戶端:https :與NTPUDPClient –