2016-11-11 9 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クライアント/サーバーを使用してこれを行うことをお勧めします。

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 
関連する問題