[已解决]本机时间与局域网其它计算机时间比对,已经提供解决方法于第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楼! 发现异常的时候的时间是,晚上在本机运行这程式时,本机时间为23:xx,然后服务器上面的时间还是11:xx,然后就出错了..... net.exe版本不一样,输出格式也就不一样。
但net.exe time获取计算机的时间最终是调用了Netapi32.NetRemoteTOD,可以自己调用这个函数。 楼上说的很高深。 像我们这种小菜, 最好的方法就是开一台机共享。 把共享机器的时间写入某个INI文件。其它机器开就对比这个INI。你说的那个上午下午的问题,我觉得也很好解决的吧,用正则。或是用StringSplit 来拆分 各位大哥,不要光说不练啊....就是没辙了才发上来了。。。 Dim $severIP='192.168.1.250'
Run(@SystemDir&"\cmd.exe /c net time \\"&$severIP&" /set /yes")
有那么麻烦吗? 直接2行代码搞定就可以了。。。 楼上的兄弟没有看明白我的主题哦,我是要对比两台机器的年月日时分,分钟允许正负一分钟的公差...
然而有些机器会有"上午/下午",有些没有,然后有些机器返回的是24小时制,有些返回的是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]