I know this is an old question but I notice that all the answers does not explain how to use those libraries. In this answer, we will go through a basic implementation and its logic behind.
A simple way to implement a NTP client is using Apache Commons Net library. This library will provide a NTPUDPClient class to manage connectionless NTP requests and return a TimeInfo instance. This instance should compute the offset between our system's time and the NTP server's time. Lets try to implement it here:
- Add the Apache Commons Net library to your project.
<dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.6</version>
</dependency>
- Create a new instance of the NTPUDPClientclass.
- Setup the default timeout and the InetAddressof the NTP Server.
- Call the NTPUDPClient.getTime()method to retrieve aTimeInfoinstance with the time information from the specified server.
- Call computeDetails()method to compute and validate details of the NTP message packet.
- Finally, get the offsetand calculate an atomic time.
Here we have a basic implementation:
import java.net.InetAddress;
import java.util.Date;
import org.apache.commons.net.ntp.NTPUDPClient; 
import org.apache.commons.net.ntp.TimeInfo;
public class NTPClient {
  private static final String SERVER_NAME = "pool.ntp.org";
  private volatile TimeInfo timeInfo;
  private volatile Long offset;
  public static void main() throws Exception {
    NTPUDPClient client = new NTPUDPClient();
    // We want to timeout if a response takes longer than 10 seconds
    client.setDefaultTimeout(10_000);
    InetAddress inetAddress = InetAddress.getByName(SERVER_NAME);
    TimeInfo timeInfo = client.getTime(inetAddress);
    timeInfo.computeDetails();
    if (timeInfo.getOffset() != null) {
        this.timeInfo = timeInfo;
        this.offset = timeInfo.getOffset();
    }
    // This system NTP time
    TimeStamp systemNtpTime = TimeStamp.getCurrentTime();
    System.out.println("System time:\t" + systemNtpTime + "  " + systemNtpTime.toDateString());
    // Calculate the remote server NTP time
    long currentTime = System.currentTimeMillis();
    TimeStamp atomicNtpTime = TimeStamp.getNtpTime(currentTime + offset).getTime()
    System.out.println("Atomic time:\t" + atomicNtpTime + "  " + atomicNtpTime.toDateString());
  }
  public boolean isComputed()
  {
    return timeInfo != null && offset != null;
  }
}
You will get something like that:
System time:    dfaa2c15.2083126e  Thu, Nov 29 2018 18:12:53.127
Atomic time:    dfaa2c15.210624dd  Thu, Nov 29 2018 18:12:53.129