kingfirekkk 发表于 2010-10-19 15:57:26

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

本帖最后由 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
timecheck()

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


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

Func time4()      ;有上午下午的时候;
;MsgBox(0,"xx",UBound($cf))
;MsgBox(0,"xx",$cf)
If StringIsDigit(StringStripWS($CF,8)) = 0 Then      ;识别时间所在数组,并识别上午、下午或24小时制
      if $CF="下午" Then $kcd=12                                                ;如果是下午,则加上12小时时差
          $time = $CF
                  $retime=StringSplit(StringStripWS($time,8),":")
                  ;MsgBox(0,"xx",$time)
                  $retime=StringLeft($retime,2)
               ;MsgBox(0,"xx",$time)
                  $time=$retime+$kcd&":"&$retime
EndIf
$r=StringSplit($date&"/"&$retime+$kcd&"/"&$retime,"/")      ;取年月日时分进行比对,以明确是否执行写入操作
if StringLen ($r)=1 Then $r=000&$r                        ;补齐年位数
if StringLen ($r)=2 Then $r=00&$r
if StringLen ($r)=3 Then $r=0&$r
if StringLen ($r)=1 Then $r=0&$r                        ;补齐月位数
if StringLen ($r)=1 Then $r=0&$r                        ;补齐日位数
if StringLen ($r)=1 Then $r=0&$r                        ;补齐时位数
if StringLen ($r)=1 Then $r=0&$r                        ;补齐分位数
;MsgBox(0,"test","服务器时间为:"&$r&$r&$r&$r&$r&@CRLF&"本机时间为:"&@YEAR&@MON&@MDAY&@HOUR&@MIN)
if @YEAR=$r and @MON=$r and @MDAY=$r and @HOUR=$r and @MIN=$r 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楼!

kingfirekkk 发表于 2010-10-19 15:59:44

发现异常的时候的时间是,晚上在本机运行这程式时,本机时间为23:xx,然后服务器上面的时间还是11:xx,然后就出错了.....

pusofalse 发表于 2010-10-19 17:24:12

net.exe版本不一样,输出格式也就不一样。
但net.exe time获取计算机的时间最终是调用了Netapi32.NetRemoteTOD,可以自己调用这个函数。

chenronting 发表于 2010-10-19 18:30:14

楼上说的很高深。 像我们这种小菜, 最好的方法就是开一台机共享。 把共享机器的时间写入某个INI文件。其它机器开就对比这个INI。你说的那个上午下午的问题,我觉得也很好解决的吧,用正则。或是用StringSplit 来拆分

kingfirekkk 发表于 2010-10-19 20:16:08

各位大哥,不要光说不练啊....就是没辙了才发上来了。。。

lanfengc 发表于 2010-10-20 20:57:31

Dim $severIP='192.168.1.250'
Run(@SystemDir&"\cmd.exe /c net time \\"&$severIP&" /set /yes")
有那么麻烦吗? 直接2行代码搞定就可以了。。。

kingfirekkk 发表于 2010-10-21 09:41:08

楼上的兄弟没有看明白我的主题哦,我是要对比两台机器的年月日时分,分钟允许正负一分钟的公差...
然而有些机器会有"上午/下午",有些没有,然后有些机器返回的是24小时制,有些返回的是12小时制....

kingfirekkk 发表于 2010-10-26 09:28:54

顶一下,看有没有兄弟有这方面的经验。

kingfirekkk 发表于 2010-11-22 11:33:24

自己再顶顶看,有没有哪位有更好的建议?

kingfirekkk 发表于 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 netand get file time!")
        ;ShellExecute($source)
        $t = FileGetTime($source, 0, 0)
        If Not @error Then
                Dim $LT
                $LT = @YEAR
                $LT = @MON
                $LT = @MDAY
                $LT = @HOUR
                $LT = @MIN
                If $LT = $t And $LT = $t And $LT = $t And $LT = $t Then
                        Select
                                Case $t = $LT
                                        FileDelete($source)
                                        Return 1
                                Case $t = $LT + 1
                                        FileDelete($source)
                                        Return 1
                                Case $t = $LT - 1
                                        FileDelete($source)
                                        Return 1
                                Case $LT = $t + 1
                                        FileDelete($source)
                                        Return 1
                                Case $LT = $t - 1
                                        FileDelete($source)
                                        Return 1
                                Case $t = 0 Or $LT = 0 Or $t = 59 Or $LT = 59
                                        FileDelete($source)
                                        If $t = 0 And $LT = 59 Then Return 1
                                        If $t = 59 And $LT = 0 Then Return 1
                                Case Else
                                        FileDelete($source)
                                        Return 0
                        EndSelect
                EndIf
                FileDelete($source)
        Else
                FileDelete($source)
                Return 0
        EndIf
EndFunc   ;==>checktime
页: [1]
查看完整版本: [已解决]本机时间与局域网其它计算机时间比对,已经提供解决方法于第10楼!