找回密码
 加入
搜索
查看: 12133|回复: 19

[网络通信] 如何与网络时间同步

 火.. [复制链接]
发表于 2013-10-11 16:12:27 | 显示全部楼层 |阅读模式
如题,我写了个程序,需要一个准确的时间,所以想到了用网络时间同步到本机,并把本机的系统时间设置成同步的时间。求高手指教,大恩将铭记于心!

评分

参与人数 1金钱 -10 收起 理由
afan -10

查看全部评分

发表于 2013-10-11 17:35:56 | 显示全部楼层
 楼主| 发表于 2013-10-12 14:53:48 | 显示全部楼层
haijie1223 发表于 2013-10-11 17:35

可能正则处理方面有问题,无法获得成功!
发表于 2013-10-12 22:46:45 | 显示全部楼层
回复 4# 鉴仔


    这个来自论坛的代码,具体是哪个帖子,忘了。对原作者说声:抱歉!
原来用StringSplit截取日期和时间,后来发现在WIN7 64位下无法工作,于是我改用了正则。
#include-once
#include <Date.au3>
_Timecheck()
Func _Timecheck() ;时间校正        
If Ping('www.baidu.com', 550) Or Ping ('www.163.com') Then 
Local $_Now_date, $year, $mon, $mday, $hour, $min, $sec        
$_Now_date = _GetSrv_Date()
If @error Then Return SetError(2, '', 0)
$year = StringRegExpReplace($_Now_date, '/.+$', '')
$mon = StringRegExpReplace($_Now_date, '.+?/(\d{1,2})/.+', '\1')
$mday = StringRegExpReplace($_Now_date, '.+/(\d{1,2})\D.+', '\1')
$hour = StringRegExpReplace($_Now_date, '.+?(\d{1,2}):.+', '\1')
$min = StringRegExpReplace($_Now_date, '.+?:(\d{1,2}):.+', '\1')
$sec = StringRegExpReplace($_Now_date, '.+:', '')
_SetDate($mday, $mon, $year)
_SetTime($hour, $min, $sec)
Return 1
EndIf
Return SetError(1, '', 0)
EndFunc   ;==>_Timecheck


Func _GetSrv_Date()
        Local $_Srvlist[14] = ["time-nw.nist.gov", _
                        "time-a.nist.gov", _
                        "time-b.nist.gov", _
                        "time-a.timefreq.bldrdoc.gov", _
                        "time-b.timefreq.bldrdoc.gov", _
                        "time-c.timefreq.bldrdoc.gov", _
                        "utcnist.colorado.edu", _
                        "time.nist.gov", _
                        "nist1.datum.com", _
                        "nist1.dc.glassey.com", _
                        "nist1.ny.glassey.com", _
                        "nist1.sj.glassey.com", _
                        "nist1.aol-ca.truetime.com", _
                        "nist1.aol-va.truetime.com"]
        UDPStartup()
        Local $_Time_Srv
        For $x = 0 To UBound($_Srvlist) - 1
                $_Time_Srv = $_Srvlist[$x]
                Local $Socket = UDPOpen(TCPNameToIP($_Time_Srv), 123)
                If @error <> 0 Then ContinueLoop
                $Status = UDPSend($Socket, MakePacket())
                If $Status = 0 Then ContinueLoop
                Local $Data = "", $i = 0
                While $Data = ""
                        $i += 1
                        $Data = UDPRecv($Socket, 100)
                        If $i = 5 Then ContinueLoop (2)
                        Sleep(88)
                WEnd
                UDPCloseSocket($Socket)
                UDPShutdown()
                ExitLoop
        Next
        If $Data = "" Then Return SetError(1, '', '')
        $Data = UnsignedHexToDec(StringMid($Data, 83, 8))
        $Data = _DateTimeFormat(_DateAdd("s", $Data, "1900/01/01 08:00:00"), 0)
        Return $Data
EndFunc   ;==>_GetSrv_Date

Func MakePacket()
        Local $P, $D = "1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
        While $D
                $P &= Chr(Dec(StringLeft($D, 2)))
                $D = StringTrimLeft($D, 2)
        WEnd
        Return $P
EndFunc   ;==>MakePacket

Func UnsignedHexToDec($_Data)
        Return Dec(StringTrimRight($_Data, 1)) * 16 + Dec(StringRight($_Data, 1))
EndFunc   ;==>UnsignedHexToD
发表于 2013-10-13 16:36:22 | 显示全部楼层
论坛里很多,搜索下吧。
发表于 2013-10-17 23:13:39 | 显示全部楼层
用另外一种方法也可以实现哦,比如说局域网里面有一台Server,使用这台Server每天定时同步北京时间,然后局域网里面的机器,每天运行一次同步时间的命令:net time \\server /yes
发表于 2013-10-20 09:55:24 | 显示全部楼层
本帖最后由 anypac 于 2013-10-20 09:57 编辑

我收藏了一个前辈的过程,自己改了一下获取服务器,就改成win7默认的服务器~~速度不慢

运行结果
;网络获取时间
MsgBox(0,"网络时间",_Hdate())

Func _Hdate()
        Local $oHTTP,$H_time,$str,$Date
        Local $mon[13]=[12,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
        $oHTTP = ObjCreate("microsoft.xmlhttp")
        $oHTTP.Open("get","http://time.windows.com/",false)
        $oHTTP.setRequestHeader("ver", "1.2")
        $oHTTP.Send()
        $str = StringTrimLeft($oHTTP.getResponseHeader("Date"),4)
        MsgBox(0,0,$str)
        For $i = 1 To 12
                $str = StringReplace($str,$mon[$i],$i)
        Next
        $str = StringSplit($str," ")
        $H_time = StringLeft($str[5],2) + 8
        If $H_time >=24 Then $H_time -= 24
                $H_time &= StringTrimLeft($str[5],2)
                $Date = $str[4]&"-"&$str[3]&"-"&$str[2]&" "&$H_time
        Return $Date
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-10-20 12:45:24 | 显示全部楼层
我自用的,送你:
#Include <Date.au3>

Do
    $www = Ping("www.baidu.com",5000)
        If $www Then
                TimeSync()
                MsgBox(0,"完成","时间已同步",3)
                ExitLoop
        Else
                $R = MsgBox(5+48,"错误","网络未连接",30)
                If $R = 2 Then Exit
        EndIf
Until $www <> 0

Func TimeSync()
        $http = ObjCreate("microsoft.xmlhttp")
        $http.Open("Get","http://www.baidu.com/?" & _Now(),False)
        $http.Send("")
        $baidutime = $http.GetResponseHeader("Date")
        $S = StringSplit("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",",")
        For $i = 1 To 12
                $baidutime = StringReplace($baidutime,$S[$i],$i)
        Next
        $S = StringSplit($baidutime,", :")
        $tNew = _Date_Time_EncodeSystemTime($S[4],$S[3],$S[5],$S[6],$S[7],$S[8])
        _Date_Time_SetSystemTime(DllStructGetPtr($tNew))
EndFunc
发表于 2013-10-21 00:20:40 | 显示全部楼层
GMT时间,哈哈哈,都不错。
http://time.windows.com/  以前试过,但是感觉速度不理想。还是国内的服务器吧
发表于 2013-10-21 20:12:47 | 显示全部楼层
我也想知道国内有哪些稳定的服务器,就是搜不到
发表于 2013-10-22 09:52:46 | 显示全部楼层
感谢分享!!!!!!!!
 楼主| 发表于 2013-10-26 10:50:34 | 显示全部楼层
回复 9# chishingchan


太感谢了,我的自动对时问题终于解决了。
 楼主| 发表于 2013-10-26 10:51:46 | 显示全部楼层
回复 8# anypac


   这个我用的时候会弹出一个登录窗口,有点不合我的意思,也谢谢大大!
发表于 2015-10-25 09:29:12 | 显示全部楼层
有没有时间校对到秒的?
发表于 2015-12-25 17:22:57 | 显示全部楼层
回贴看信息呵呵
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 11:46 , Processed in 0.078635 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表