2016-11-11 5 views
0

Или только знать смещение между системными часами и сервером? Если часы моей системы отличаются от сервера из-за часового пояса, что происходит? спасибоВозможно ли синхронизировать системные часы через клиент NTP в Java?

+0

Часы OS должны поддерживаться ОС, а не кодом Java. Если вы выполняете связь между клиентом и сервером между компьютерами, использующими разные часовые пояса, вы должны убедиться, что обе стороны согласны с форматом передаваемых значений даты, так что не возникают проблемы с часовым поясом, например. передайте чистую эпоху millis (всегда 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

Пожалуйста, будьте более конкретным: какой клиент? Установка системных часов не поддерживается стандартным API Java, но могут существовать реализации, специфичные для платформы, которые могут устанавливать системные часы. (Хотя вам нужно будет запускать Java с повышенными привилегиями, и это будет не так точно, как реализация, отличная от Java, без сбора мусора и компиляции JIT, чтобы отключить тайминги) –

+0

спасибо, клиент, которым я пользуюсь, является клиентом apache: https : //commons.apache.org/net/ с NTPUDPClient –

ответ

0

Java не имеет API для установки системных часов напрямую. Это можно сделать в собственном коде C/C++, вызванном из ваших Java-классов, но для выполнения которых требуются права администратора.

Есть некоторые 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