有一台服务器的时间老是走着走着就慢了10来秒,一直没查出什么原因,云服务商去帮忙去查也查不出原因,我就想写一个简单的程序在windows服务器上不断的去校验,如果有误差,就同步一次时间。同步我们是可以用命令:
w32tm /resync
那么获取网络时间的话,我们可以获取百度header的时间,也可以先在CMD下面使用命令得到网络时间和误差:
w32tm /stripchart /computer:time.windows.com /samples:1 /dataonly
下面的则是获取百度header的时间:
strURL = "http://www.baidu.com"
Set objRequest = CreateObject("MSXML2.XMLHTTP")
' 发送 HEAD 请求,只获取响应头信息
objRequest.open "HEAD", strURL, False
objRequest.send
dteTime = Split(Replace(objRequest.getResponseHeader("Date"), " GMT", ""), ",")(1)
networkTime = DateAdd("h", 8 ,CDate(dteTime))所有代码如下,保存为.hta文件,双击就可以直接运行:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<hta>
<style type="text/css">
* {font-size:14px;font-family:'微软雅黑',Tahoma;margin:0;padding:0;
}
table {width:400px;height:400px;}
.auto-style2 {
height: 29px;
}
.auto-style3 {
height: 18px;
}
.auto-style4 {
height: 135px;
}
.auto-style5 {
height: 102px;
vertical-align:top;
background:black;
color:white;
padding:5px;
}
</style>
<title>流行美时间同步工具</title>
<hta:application
id="timeSyncApp"
applicationname="时间同步"
icon=""
border="thin"
showintaskbar="yes"
scroll="no"
singleinstance="yes"
windowState="normal"
/>
<script language="VBScript">
' 获取本地时间和Internet时间
Sub GetTimes()
On Error Resume Next
window.resizeTo 420, 230
strURL = "http://www.baidu.com"
Set objRequest = CreateObject("MSXML2.XMLHTTP")
' 发送 HEAD 请求,只获取响应头信息
objRequest.open "HEAD", strURL, False
objRequest.send
dteTime = Split(Replace(objRequest.getResponseHeader("Date"), " GMT", ""), ",")(1)
networkTime = DateAdd("h", 8 ,CDate(dteTime))
my_log = "网络时间:" & networkTime & "<br>"
my_log = my_log & "本机时间:" & now() & "<br>"
diffS = DateDiff("s",networkTime,now)
my_log = my_log & "误差秒数:" & diffS & "<br>"
if Math.Abs(diffS) < 5 then
my_log = my_log & "处理结果:" & "<font color='green'>相差不超过5秒,不需要处理</font>"
else
call SyncTime
end if
document.all.result.innerHTML = my_log
set shell = nothing
End Sub
' 同步时间
Sub SyncTime
On Error Resume Next
Set objShell = CreateObject("WScript.Shell")
cmd = "w32tm /resync"
ret = objShell.Run(cmd, 0, True)
If ret <> 0 Then
document.all.status.innerHTML = "<font color='red'>同步失败,同步时间:" & Now & "</font>"
Else
document.all.status.innerHTML = "<font color='green'>同步成功,同步时间:" &Now & "</font>"
End If
set objShell = nothing
End Sub
' 定期更新时间
Sub UpdateTimes
GetTimes
SetTimeout "UpdateTimes", 5000
End Sub
' 初始化界面
Sub Init()
UpdateTimes
End Sub
</script>
</head>
<body onload="Init" >
<table class="auto-style4">
<tr>
<td class="auto-style2" >获取网络时间结果:</td>
</tr>
<tr>
<td id="result" class="auto-style5"></td>
</tr>
<tr>
<td class="auto-style3"><span id="status"></span></td>
</tr>
</table>
</body>
</html>当然如果用aardio来做的话,也很简单,而且更加灵活,参考:
import console;
import process.popen;
while(true){
var prcs = process.popen("w32tm /stripchart /computer:time.windows.com /samples:1 /dataonly");
var diffS ;
for( all,out,err in prcs.each() ){
console.log(all)
//最后一行是有个逗号
if(string.find(all,",")){
diffS = string.split(all,",")[2]
diffS = string.replace(diffS,"+","")
diffS = string.replace(diffS,"s","")
//转成数字
var iDiffs = tonumber(diffS)
//if(iDiffs >= 5){
console.log("误差超过5秒");
var tb = process.popen("w32tm /resync");
console.log(tb.readAll());
//}
console.log(iDiffs)
}
}
thread.delay(3000);
}