2016-11-11 1 views
0

아니면 시스템 클럭과 서버 사이의 오프셋을 알고 있어야합니까? 시간대 때문에 내 시스템의 시계가 서버와 다른 경우 어떻게됩니까? 감사합니다.Java에서 NTP 클라이언트를 통해 시스템 시계를 동기화 할 수 있습니까?

+0

OS 시계는 Java 코드가 아닌 OS에서 관리해야합니다. 다른 시간대를 실행하는 컴퓨터간에 클라이언트/서버 통신을 수행하는 경우 양측이 전송되는 날짜 값의 형식에 동의해야합니다. 따라서 시간대 문제가 발생하지 않습니다. 순수 에포크 밀리 초 (항상 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 : //commons.apache.org/net/ with NTPUDPClient –

답변

0

Java에 시스템 시계를 직접 설정하는 API가 없습니다. 이 작업은 Java 클래스에서 호출 된 C/C++ 원시 코드에서 수행 할 수 있지만 실행할 수있는 관리 권한이 필요합니다.

로컬 시스템 클럭과 원격 NTP 서버 사이의 시계 오프셋을 계산할 수있는 Apache Commons Net 프로젝트와 같은 일부 Java 라이브러리가 있습니다. 로컬 시계를 동기화하지 않는 오프셋을 계산하는 코드를 제공합니다. 실제로 동기화하려면 NTP 클라이언트/서버를 사용하여이 작업을 수행하는 것이 좋습니다. 거의 모든 플랫폼 (Windows, Mac, Linux 등)에 대한 NTP 구현이 있습니다.

Java 라이브러리와 NTP 서비스는 시간대 설정이 영향을 미치지 않으므로 UTC 기반 시간을 사용합니다.

예 : 로컬 클럭 오프셋 (또는 시간 드리프트)의 로컬 클럭과이 규격 NTP 방정식에 따른 NTP 서버의 클록에 대하여 계산되는

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(); 

참고.

LocalClockOffset = ((ReceiveTimestamp - OriginateTimestamp) + 
          (TransmitTimestamp - DestinationTimestamp))/2 
관련 문제