找回密码
 加入
搜索
查看: 5292|回复: 9

[系统综合] [已解决]本机时间与局域网其它计算机时间比对,已经提供解决方法于第10楼!

  [复制链接]
发表于 2010-10-19 15:57:26 | 显示全部楼层 |阅读模式
本帖最后由 kingfirekkk 于 2010-12-11 16:45 编辑

这两天头有点大了,想事情也不是很清晰了,请各位大大看看我的代码,有些机器上面运行没有问题,有些机器上面运行有问题啊。。。。。
以下代码为参考论坛某位大神的,被我改得不成样子了...
;===========================================================
;                   时间检查模块!
;===========================================================
$server="192.168.0.1"   ;局域网的另外一台Winxp机器;
Global $CF = ''
Global $str = ''
Global $too = Run(@ComSpec & ' /c net time \\' & $server, '', 0, 2)
While 1
        Sleep(1)
        $str &= StdoutRead($too)
        If @error Then ExitLoop
 WEnd
$cl = StringTrimLeft($str,StringInStr($str,'是')+1)        ;去除无效字符
$CF = StringSplit($cl,' ')                                                        ;分离获取年月日时间
$date = $CF[1]
timecheck()

Func timecheck()
Select
        Case StringInStr($cl,"午")>0
                ;MsgBox(0,"值",$cl)
$time=$cf[3]
;MsgBox(0,"xx",$cf[3])
time4()
Case Else
        ;MsgBox(0,"值2",$cf[2])
;$time=$cf[2]
time3()
EndSelect
EndFunc  ;==>timecheck


Func time3()             ;没有上午下午的时候;
;MsgBox(0,"xx",UBound($cf))
;MsgBox(0,"xx",$cf[1])
;如果是下午,则加上12小时时差
;MsgBox(0,"Show time",$time)
$time=$cf[2]
$retime=StringSplit(StringStripWS($time,8),":")
;MsgBox(0,"Show time",$retime[2])
$retime[2]=StringLeft($retime[2],2)
$time=$retime[1]&":"&$retime[2]
$r=StringSplit($date&"/"&$retime[1]&"/"&$retime[2],"/")        ;取年月日时分进行比对,以明确是否执行写入操作
if StringLen ($r[1])=1 Then $r[1]=000&$r[1]                        ;补齐年位数
if StringLen ($r[1])=2 Then $r[1]=00&$r[1]
if StringLen ($r[1])=3 Then $r[1]=0&$r[1]
if StringLen ($r[2])=1 Then $r[2]=0&$r[2]                        ;补齐月位数
if StringLen ($r[3])=1 Then $r[3]=0&$r[3]                        ;补齐日位数
if StringLen ($r[4])=1 Then $r[4]=0&$r[4]                        ;补齐时位数
if StringLen ($r[5])=1 Then $r[5]=0&$r[5]                        ;补齐分位数
;MsgBox(0,"test","服务器时间为:"&$r[1]&$r[2]&$r[3]&$r[4]&$r[5]&@CRLF&"本机时间为:   "&@YEAR&@MON&@MDAY&@HOUR&@MIN)
if @YEAR=$r[1] and @MON=$r[2] and @MDAY=$r[3] and @HOUR=$r[4] and @MIN=$r[5] Or @MIN+1=$r[5] Or @MIN-1=$r[5] Then
 MsgBox(0,"恭喜!","时间一致!")
 Return
Else
        MsgBox(0,"test","服务器时间为:"&$r[1]&$r[2]&$r[3]&$r[4]&$r[5]&@CRLF&"本机时间为:   "&@YEAR&@MON&@MDAY&@HOUR&@MIN)
        MsgBox(0,"警告!","当前时间差异大于一分钟,请再次确认!")
        EndIf
EndFunc

Func time4()        ;有上午下午的时候;
;MsgBox(0,"xx",UBound($cf))
;MsgBox(0,"xx",$cf[1])
If StringIsDigit(StringStripWS($CF[3],8)) = 0 Then        ;识别时间所在数组,并识别上午、下午或24小时制
        if $CF[2]="下午" Then $kcd=12                                                ;如果是下午,则加上12小时时差
          $time = $CF[3]
                  $retime=StringSplit(StringStripWS($time,8),":")
                  ;MsgBox(0,"xx",$time)
                  $retime[2]=StringLeft($retime[2],2)
                 ;MsgBox(0,"xx",$time)
                  $time=$retime[1]+$kcd&":"&$retime[2]
EndIf
$r=StringSplit($date&"/"&$retime[1]+$kcd&"/"&$retime[2],"/")        ;取年月日时分进行比对,以明确是否执行写入操作
if StringLen ($r[1])=1 Then $r[1]=000&$r[1]                        ;补齐年位数
if StringLen ($r[1])=2 Then $r[1]=00&$r[1]
if StringLen ($r[1])=3 Then $r[1]=0&$r[1]
if StringLen ($r[2])=1 Then $r[2]=0&$r[2]                        ;补齐月位数
if StringLen ($r[3])=1 Then $r[3]=0&$r[3]                        ;补齐日位数
if StringLen ($r[4])=1 Then $r[4]=0&$r[4]                        ;补齐时位数
if StringLen ($r[5])=1 Then $r[5]=0&$r[5]                        ;补齐分位数
;MsgBox(0,"test","服务器时间为:"&$r[1]&$r[2]&$r[3]&$r[4]&$r[5]&@CRLF&"本机时间为:  "&@YEAR&@MON&@MDAY&@HOUR&@MIN)
if @YEAR=$r[1] and @MON=$r[2] and @MDAY=$r[3] and @HOUR=$r[4] and @MIN=$r[5] Then
          MsgBox(0,"恭喜!","时间差异小于一分钟!")
          $timere="Time Check OK"
         Return
Else
        MsgBox(0,"警告!","当前时间差异大于一分钟!")
          $timere="Time Check NG"
        EndIf
EndFunc
其实最终需要解决的问题其实是有时候在某些XP的机器上面,返回的时间是:2010/10/19 下午 03:58
有的机器返回的是:       2010/10/19 15:58
现在头有点大,搞不清东南西北了,不知道怎么改了,请各位大神不吝赐教,在此谢过啦。

2010/12/11 PM16:47   Updaet: 提供解决方法于第10楼!
 楼主| 发表于 2010-10-19 15:59:44 | 显示全部楼层
发现异常的时候的时间是,晚上在本机运行这程式时,本机时间为23:xx,然后服务器上面的时间还是11:xx,然后就出错了.....
发表于 2010-10-19 17:24:12 | 显示全部楼层
net.exe版本不一样,输出格式也就不一样。
但net.exe time获取计算机的时间最终是调用了Netapi32.NetRemoteTOD,可以自己调用这个函数。
发表于 2010-10-19 18:30:14 | 显示全部楼层
楼上说的很高深。 像我们这种小菜, 最好的方法就是开一台机共享。 把共享机器的时间写入某个INI文件。其它机器开就对比这个INI。你说的那个上午下午的问题,我觉得也很好解决的吧,用正则。或是用StringSplit 来拆分
 楼主| 发表于 2010-10-19 20:16:08 | 显示全部楼层
各位大哥,不要光说不练啊....就是没辙了才发上来了。。。
发表于 2010-10-20 20:57:31 | 显示全部楼层
Dim $severIP='192.168.1.250'
Run(@SystemDir&"\cmd.exe /c net time \"&$severIP&" /set /yes")
有那么麻烦吗? 直接2行代码搞定就可以了。。。
 楼主| 发表于 2010-10-21 09:41:08 | 显示全部楼层
楼上的兄弟没有看明白我的主题哦,我是要对比两台机器的年月日时分,分钟允许正负一分钟的公差...
然而有些机器会有"上午/下午",有些没有,然后有些机器返回的是24小时制,有些返回的是12小时制....
 楼主| 发表于 2010-10-26 09:28:54 | 显示全部楼层
顶一下,看有没有兄弟有这方面的经验。
 楼主| 发表于 2010-11-22 11:33:24 | 显示全部楼层
自己再顶顶看,有没有哪位有更好的建议?
 楼主| 发表于 2010-12-11 16:44:12 | 显示全部楼层
最终自己使用另外一种方法解决了此问题(见以下源代码),如果可以连接Internet网络的话,可以使用UDP+NTP Server来实现此功能,论坛中NTP源代码即可实现!
$source=\\192.168.0.1\share\test.tmp
;*******************************************
; $source所在服务器,需打开共享,同时需要共享目录可写;
;*******************************************

if checktime() then
 msgbox(0,"","本机与服务器时间一致,时间差在正负1分钟以内!")
else
 msgbox(0,"","本机与服务器时间不一致,时间错误!")
endif

Func checktime()
        If FileExists($source) Then FileDelete($source)
        FileWrite($source, "This is a test file for net  and get file time!")
        ;ShellExecute($source)
        $t = FileGetTime($source, 0, 0)
        If Not @error Then
                Dim $LT[5]
                $LT[0] = @YEAR
                $LT[1] = @MON
                $LT[2] = @MDAY
                $LT[3] = @HOUR
                $LT[4] = @MIN
                If $LT[0] = $t[0] And $LT[1] = $t[1] And $LT[2] = $t[2] And $LT[3] = $t[3] Then
                        Select
                                Case $t[4] = $LT[4]
                                        FileDelete($source)
                                        Return 1
                                Case $t[4] = $LT[4] + 1
                                        FileDelete($source)
                                        Return 1
                                Case $t[4] = $LT[4] - 1
                                        FileDelete($source)
                                        Return 1
                                Case $LT[4] = $t[4] + 1
                                        FileDelete($source)
                                        Return 1
                                Case $LT[4] = $t[4] - 1
                                        FileDelete($source)
                                        Return 1
                                Case $t[4] = 0 Or $LT[4] = 0 Or $t[4] = 59 Or $LT[4] = 59
                                        FileDelete($source)
                                        If $t[4] = 0 And $LT[4] = 59 Then Return 1
                                        If $t[4] = 59 And $LT[4] = 0 Then Return 1
                                Case Else
                                        FileDelete($source)
                                        Return 0
                        EndSelect
                EndIf
                FileDelete($source)
        Else
                FileDelete($source)
                Return 0
        EndIf
EndFunc   ;==>checktime
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 21:02 , Processed in 0.088067 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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