Get the atomic timeTag(s): Date and Time
We connect to a publicly accessible time server on the internet and parse the result.
List of available time servers : http://tf.nist.gov/tf-cgi/servers.cgi
NOTE : All users should ensure that their software NEVER queries a server more frequently than once every 4 seconds. Systems that exceed this rate will be refused service. In extreme cases, systems that exceed this limit may be considered as attempting a denial-of-service attack.
Using java.time
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.TimeZone;
import java.time.LocalDateTime;
public final class AtomicTime {
  // NIST, Boulder, Colorado  (time-a.timefreq.bldrdoc.gov)
  // public static final String ATOMICTIME_SERVER="132.163.4.101";
  // NIST, Gaithersburg, Maryland (time-a.nist.gov)
  // public static final String ATOMICTIME_SERVER="129.6.15.28";
  // NIST, Gaithersburg, Maryland  (time-c.nist.gov)
  public static final String ATOMICTIME_SERVER="129.6.15.30";
  public static final int ATOMICTIME_PORT = 13;
  public final static LocalDateTime getAtomicTime() throws IOException{
    BufferedReader in = null;
    Socket conn = null;
    try {
       conn = new Socket(ATOMICTIME_SERVER, ATOMICTIME_PORT);
       in = new BufferedReader
         (new InputStreamReader(conn.getInputStream()));
       String atomicTime;
       while (true) {
          if ( (atomicTime = in.readLine()).indexOf("*") > -1) {
             break;
          }
       }
       System.out.println("DEBUG 1 : " + atomicTime);
       String[] fields = atomicTime.split(" ");
       String[] date = fields[1].split("-");
       // deals with the timezone and the daylight-saving-time (you may need to adjust this)
       TimeZone tz = TimeZone.getDefault(); // or .getDefault()
       int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
       System.out.println("DEBUG 2 : " + gmt + " " + TimeZone.getDefault());
       String[] time = fields[2].split(":");
       LocalDateTime ldt = LocalDateTime.of(
            2000 +  Integer.parseInt(date[0]) ,  // year
            Integer.parseInt(date[1])-1,         // month
            Integer.parseInt(date[2]),           // dayOfMonth
            Integer.parseInt(time[0]) + gmt,     // hour
            Integer.parseInt(time[1]),           // minute
            Integer.parseInt(time[2]));          // second
       return ldt;
    }
    catch (IOException e){
       throw e;
    }
    finally {
       if (in != null) { in.close();   }
       if (conn != null) { conn.close();   }
    }
  }
  public static void main(String args[]) throws IOException {
    System.out.println("Atomic time : " + AtomicTime.getAtomicTime());
  }
  /*
    ref : http://www.bldrdoc.gov/doc-tour/atomic_clock.html
                       49825 95-04-18 22:24:11 50 0 0 50.0 UTC(NIST) *
                       |     |        |     | | |  |      |      |
    These are the last +     |        |     | | |  |      |      |
    five digits of the       |        |     | | |  |      |      |
    Modified Julian Date     |        |     | | |  |      |      |
                             |        |     | | |  |      |      |
    Year, Month and Day <----+        |     | | |  |      |      |
                                      |     | | |  |      |      |
    Hour, minute, and second of the <-+     | | |  |      |      |
    current UTC at Greenwich.               | | |  |      |      |
                                            | | |  |      |      |
    DST - Daylight Savings Time code <------+ | |  |      |      |
    00 means standard time(ST), 50 means DST  | |  |      |      |
    99 to 51 = Now on ST, goto DST when local | |  |      |      |
    time is 2:00am, and the count is 51.      | |  |      |      |
    49 to 01 = Now on DST, goto ST when local | |  |      |      |
    time is 2:00am, and the count is 01.      | |  |      |      |
                                              | |  |      |      |
    Leap second flag is set to "1" when <-----+ |  |      |      |
    a leap second will be added on the last     |  |      |      |
    day of the current UTC month.  A value of   |  |      |      |
    "2" indicates the removal of a leap second. |  |      |      |
                                                |  |      |      |
    Health Flag.  The normal value of this    <-+  |      |      |
    flag is 0.  Positive values mean there may     |      |      |
    be an error with the transmitted time.         |      |      |
                                                   |      |      |
    The number of milliseconds ACTS is advancing <-+      |      |
    the time stamp, to account for network lag.           |      |
                                                          |      |
    Coordinated Universal Time from the National <--------+      |
    Institute of Standards & Technology.                         |
                                                                 |
    The instant the "*" appears, is the exact time. <------------+
  */
}
Using Gregorian Calendar (the old way)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public final class DateUtils {
  // NIST, Boulder, Colorado  (time-a.timefreq.bldrdoc.gov)
  // public static final String ATOMICTIME_SERVER="132.163.4.101";
  // NIST, Gaithersburg, Maryland (time-a.nist.gov)
  // public static final String ATOMICTIME_SERVER="129.6.15.28";
  // NIST, Gaithersburg, Maryland  (time-c.nist.gov)
  public static final String ATOMICTIME_SERVER="129.6.15.30";
  public static final int ATOMICTIME_PORT = 13;
  public final static GregorianCalendar getAtomicTime() throws IOException{
    BufferedReader in = null;
    Socket conn = null;
    try {
       conn = new Socket(ATOMICTIME_SERVER, ATOMICTIME_PORT);
       in = new BufferedReader
         (new InputStreamReader(conn.getInputStream()));
       String atomicTime;
       while (true) {
          if ( (atomicTime = in.readLine()).indexOf("*") > -1) {
             break;
          }
       }
       System.out.println("DEBUG 1 : " + atomicTime);
       String[] fields = atomicTime.split(" ");
       GregorianCalendar calendar = new GregorianCalendar();
       String[] date = fields[1].split("-");
       calendar.set(Calendar.YEAR, 2000 +  Integer.parseInt(date[0]));
       calendar.set(Calendar.MONTH, Integer.parseInt(date[1])-1);
       calendar.set(Calendar.DATE, Integer.parseInt(date[2]));
       // deals with the timezone and the daylight-saving-time (you may need to adjust this)
       TimeZone tz = TimeZone.getDefault()
       int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
       System.out.println("DEBUG 2 : " + gmt);
       String[] time = fields[2].split(":");
       calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]) + gmt);
       calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
       calendar.set(Calendar.SECOND, Integer.parseInt(time[2]));
       return calendar;
    }
    catch (IOException e){
       throw e;
    }
    finally {
       if (in != null) { in.close();   }
       if (conn != null) { conn.close();   }
    }
  }
  public static void main(String args[]) throws IOException {
    SimpleDateFormat sdf =
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("Atomic time : " +
        sdf.format(DateUtils.getAtomicTime().getTime()));
  }
  /*
    ref : http://www.bldrdoc.gov/doc-tour/atomic_clock.html
                       49825 95-04-18 22:24:11 50 0 0 50.0 UTC(NIST) *
                       |     |        |     | | |  |      |      |
    These are the last +     |        |     | | |  |      |      |
    five digits of the       |        |     | | |  |      |      |
    Modified Julian Date     |        |     | | |  |      |      |
                             |        |     | | |  |      |      |
    Year, Month and Day <----+        |     | | |  |      |      |
                                      |     | | |  |      |      |
    Hour, minute, and second of the <-+     | | |  |      |      |
    current UTC at Greenwich.               | | |  |      |      |
                                            | | |  |      |      |
    DST - Daylight Savings Time code <------+ | |  |      |      |
    00 means standard time(ST), 50 means DST  | |  |      |      |
    99 to 51 = Now on ST, goto DST when local | |  |      |      |
    time is 2:00am, and the count is 51.      | |  |      |      |
    49 to 01 = Now on DST, goto ST when local | |  |      |      |
    time is 2:00am, and the count is 01.      | |  |      |      |
                                              | |  |      |      |
    Leap second flag is set to "1" when <-----+ |  |      |      |
    a leap second will be added on the last     |  |      |      |
    day of the current UTC month.  A value of   |  |      |      |
    "2" indicates the removal of a leap second. |  |      |      |
                                                |  |      |      |
    Health Flag.  The normal value of this    <-+  |      |      |
    flag is 0.  Positive values mean there may     |      |      |
    be an error with the transmitted time.         |      |      |
                                                   |      |      |
    The number of milliseconds ACTS is advancing <-+      |      |
    the time stamp, to account for network lag.           |      |
                                                          |      |
    Coordinated Universal Time from the National <--------+      |
    Institute of Standards & Technology.                         |
                                                                 |
    The instant the "*" appears, is the exact time. <------------+
  */
}
It's not possible to set your local computer clock in pure Java.
You need to use an external utility provided by the OS or call a JNI routine, see this HowTo.
  mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com
