java 获取服务器时间同步本地计算机时间

http://hi.baidu.com/captives/item/25c8b80170a9b0ccf45ba6f8

————————————————————————————————————————————————————————

 

     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);  

            }  

        }  

    } 

转载于:https://www.cnblogs.com/cuizhf/p/3760195.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值