java获取原子钟时间并改变本地时间

扫扫关注“茶爸爸”微信公众号
java获取原子钟时间并改变本地时间_第1张图片
坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活。

 package dtm.tools; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import java.util.logging.Level; import java.util.logging.Logger; /** * SyncTime 获取原子钟的时间,并设置为系统时间 * @author Administrator */ public class SyncTime { private static int sleepMinutes = 0; private static final long EPOCH_OFFSET_MILLIS; private static final String[] hostName = {"time-a.nist.gov", "time-nw.nist.gov", "time.nist.gov"}; static { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // Java使用的参照标准是1970年,而时间服务器返回的秒是相当1900年的,算一下偏移 calendar.set(1900, Calendar.JANUARY, 1, 0, 0, 0); EPOCH_OFFSET_MILLIS = Math.abs(calendar.getTime().getTime()); } public static void main(String[] args) { GetWebTime(); } private static Date getNetDate(String hostName) { Date date = null; long result = 0; try { Socket socket = new Socket(hostName, 37); BufferedInputStream bis = new BufferedInputStream(socket.getInputStream(), socket.getReceiveBufferSize()); int b1 = bis.read(); int b2 = bis.read(); int b3 = bis.read(); int b4 = bis.read(); if ((b1 | b2 | b3 | b3) < 0) { return null; } result = (((long) b1) << 24) + (b2 << 16) + (b3 << 8) + b4; date = new Date(result * 1000 - EPOCH_OFFSET_MILLIS); socket.close(); } catch (UnknownHostException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } return date; } /** * 通过ping命令判断是否离线 * @return */ public static boolean offLine() { Runtime run = Runtime.getRuntime(); try { Process process = run.exec("ping www.hao123.com"); InputStream s = process.getInputStream(); BufferedReader bis = new BufferedReader(new InputStreamReader(s)); String str = bis.readLine(); while (str != null) { if (str.startsWith("Reply from")) { return false; } str = bis.readLine(); } process.waitFor(); } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } return true; } /** * 通过调用本地命令date和time修改计算机时间 * @param date */ private static void setComputeDate(Date date) { Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")); c.setTime(date); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); c.setTime(new Date()); int year_c = c.get(Calendar.YEAR); int month_c = c.get(Calendar.MONTH) + 1; int day_c = c.get(Calendar.DAY_OF_MONTH); int hour_c = c.get(Calendar.HOUR_OF_DAY); int minute_c = c.get(Calendar.MINUTE); String ymd = year + "-" + month + "-" + day; String time = hour + ":" + minute + ":" + second; try { // 日期不一致就修改一下日期 if (year != year_c || month != month_c || day != day_c) { String cmd = "cmd /c date " + ymd; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } // 时间不一致就修改一下时间 if (hour != hour_c || minute != minute_c) { String cmd = "cmd /c time " + time; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } } public static void GetWebTime() { // 检测电脑是否在线 while (offLine() && sleepMinutes < 30) { try { Thread.sleep(120000); sleepMinutes += 2; } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } } // 30分钟还没有联线,表示就不上网了,退出吧 if (sleepMinutes >= 30) { System.exit(0); } // 从网络上获取时间 Date date = null; for (int i = 0; i < hostName.length; i++) { date = getNetDate(hostName[i]); if (date != null) { break; } } // 修改本机时间 if (date != null) { System.out.println("原子钟时间:"+date); setComputeDate(date); } } }

你可能感兴趣的:(java,Date,String,calendar,null)