找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 45166|回复: 14

[原创] VBS校准系统时间

[复制链接]
发表于 2013-1-10 00:49:28 | 显示全部楼层 |阅读模式
本帖最后由 batman 于 2013-1-10 18:23 编辑

更新为自动判断时间格式,WIN7 XP测试通过,WIN8待测试:

  1. 'VBS校准系统时间 BY BatMan http://www.bathome.net
  2. Dim objXML, Url, Message
  3. Message = "恭喜你,本机时间非常准确无需校对!"
  4. Set objXML = CreateObject("MSXML2.XmlHttp")
  5. Url = "http://open.baidu.com/special/time/"
  6. objXML.open "GET", Url, False
  7. objXML.send()
  8. Do Until objXML.readyState = 4 : WScript.Sleep 200 : Loop
  9. Dim objStr, LocalDate
  10. objStr = objXML.responseText
  11. LocalDate = Now()
  12. Set objXML = Nothing
  13. Dim objREG, regNum
  14. Set objREG = New RegExp
  15. objREG.Global = True
  16. objREG.IgnoreCase = True
  17. objREG.Pattern = "window.baidu_time\((\d{13,})\)"
  18. regNum = Int(objREG.Execute(objStr)(0).Submatches(0)) /1000
  19. Dim OldDate, BJDate, Num, Num1
  20. OldDate = "1970-01-01 08:00:00"
  21. BJDate = DateAdd("s", regNum, OldDate)
  22. Num = DateDiff("s", LocalDate, BJDate)
  23. If Abs(Num) >=1 Then
  24.   Dim DM, DT, TM, objSHELL
  25.   DM = DateAdd("S", Num, Now())
  26.   DT = DateValue(DM)
  27.   TM = TimeValue(DM)
  28.   If InStr(Now, "午") Then
  29.     Dim Arr, Arr1, h24
  30.     Arr = Split(TM, " ")
  31.     Arr1 = Split(Arr(1), ":")
  32.     h24 = Arr1(0)
  33.     If Arr(0) = "下午" Then
  34.       h24 = h24 + 12
  35.       Else
  36.       If h24 = 12 Then h24 = 0
  37.     End If
  38.     TM = h24 & ":" & Arr1(1) & ":" & Arr1(2)
  39.   End If
  40.   Set objSHELL = CreateObject("Wscript.Shell")
  41.   objSHELL.Run "cmd /cdate " & DT, False, True
  42.   objSHELL.Run "cmd /ctime " & TM, False, True
  43.   Num1 = Abs(DateDiff("s", Now(), BJDate))
  44.   Message = "【校准前】" & vbCrLf _
  45.     & "标准北京时间为:" & vbTab & BJDate & vbCrLf _
  46.     & "本机系统时间为:" & vbTab & LocalDate & vbCrLf _
  47.     & "与标准时间相差:" & vbTab & Abs(Num) & "秒" & vbCrLf & vbCrLf _
  48.     & "【校准后】" & vbCrLf _
  49.     & "本机系统时间为:" & vbTab & Now() & vbCrLf _
  50.     & "与标准时间相差:" & vbTab & Num1 & "秒"
  51.   Set objSHELL = Nothing
  52. End If
  53. WScript.Echo Message
复制代码

评分

参与人数 1技术 +1 收起 理由
极品小猫 + 1 好东西,感谢分享

查看全部评分

发表于 2013-1-10 08:14:52 | 显示全部楼层
29行,下标越界
 楼主| 发表于 2013-1-10 11:53:50 | 显示全部楼层
回复 2# czjt1234


    是因为时间格式的问题,家里的电脑是12小时制。。。
  已修改为24小时制,应该大多数系统时间都是24小时制吧。。。
发表于 2013-1-10 14:11:53 | 显示全部楼层
本帖最后由 522235677 于 2013-1-10 14:13 编辑

以后就方便了,网上有的校准软件杀毒软件会报毒……
发表于 2013-1-10 16:48:59 | 显示全部楼层
不错,不过可能由于程序的运行获取信息的延时显示会误差1到2秒
发表于 2013-1-10 16:50:42 | 显示全部楼层
一般系统默认都采用24小时制
这个东西好,每次用系统自身的更新系统时间都巨麻烦,更新前还必须调系统日期才能更新
 楼主| 发表于 2013-1-10 22:57:09 | 显示全部楼层
哼哼哈嘿!快使用WMI:

  1. 'VBS校准系统时间 BY BatMan http://www.bathome.net
  2. Dim objXML, Url, Message
  3. Message = "恭喜你,本机时间非常准确无需校对!"
  4. Set objXML = CreateObject("MSXML2.XmlHttp")
  5. Url = "http://open.baidu.com/special/time/"
  6. objXML.open "GET", Url, False
  7. objXML.send()
  8. Do Until objXML.readyState = 4 : WScript.Sleep 200 : Loop
  9. Dim objStr, LocalDate
  10. objStr = objXML.responseText
  11. LocalDate = Now()
  12. Set objXML = Nothing
  13. Dim objREG, regNum
  14. Set objREG = New RegExp
  15. objREG.Global = True
  16. objREG.IgnoreCase = True
  17. objREG.Pattern = "window.baidu_time\((\d{13,})\)"
  18. regNum = Int(objREG.Execute(objStr)(0).Submatches(0)) /1000
  19. Dim OldDate, BJDate, Num, Num1
  20. OldDate = "1970-01-01 08:00:00"
  21. BJDate = DateAdd("s", regNum, OldDate)
  22. Num = DateDiff("s", LocalDate, BJDate)
  23. If Abs(Num) >=1 Then
  24.   Dim DM, y, M, D, H, MI, S, NewDateTime
  25.   DM = DateAdd("S", Num, Now())
  26.   y = Year(DM)
  27.   M = Right(0 & Month(DM), 2)
  28.   D = Right(0 & Day(DM), 2)
  29.   H = Right(0 & Hour(DM), 2)
  30.   MI = Right(0 & Minute(DM), 2)
  31.   S = Right(0 & Second(DM), 2)
  32.   '将时间转化成UTC格式
  33.   NewDateTime = y & M & D & H & MI & S & ".000000+480"
  34.   Dim objWMI, objItems, objItem
  35.   Set objWMI = GetObject("winmgmts:{(systemtime)}!\\.\Root\Cimv2")
  36.   Set objItems = objWMI.ExecQuery("Select * From Win32_OperatingSystem")
  37.   For Each objItem In objItems
  38.     objItem.SetDateTime NewDateTime
  39.   Next
  40.   Set objWMI = Nothing
  41.   Num1 = Abs(DateDiff("s", Now(), BJDate))
  42.   Message = "【校准前】" & vbCrLf _
  43.     & "标准北京时间为:" & vbTab & BJDate & vbCrLf _
  44.     & "本机系统时间为:" & vbTab & LocalDate & vbCrLf _
  45.     & "与标准时间相差:" & vbTab & Abs(Num) & "秒" & vbCrLf & vbCrLf _
  46.     & "【校准后】" & vbCrLf _
  47.     & "本机系统时间为:" & vbTab & Now() & vbCrLf _
  48.     & "与标准时间相差:" & vbTab & Num1 & "秒"
  49.   Set objSHELL = Nothing
  50. End If
  51. WScript.Echo Message
复制代码
发表于 2013-1-11 01:01:29 | 显示全部楼层
建议加入 UNC 运行提醒。

JS版
  1. <title>
  2.     EasyX v20120603(beta) 安装向导
  3. </title>
  4. <script type="text/javascript">
  5.     function GetSystemVersion() {
  6.         var os = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem");
  7.         for (var e = new Enumerator(os); ! e.atEnd(); e.moveNext()) {
  8.             var v = e.item().Version;
  9.             var ss = v.split('.');
  10.             return ss[0] + ss[1];
  11.         }
  12.         return - 1;
  13.     }
  14.     if (GetSystemVersion() >= 60) {
  15.         var cmd = location.pathname;
  16.         if (cmd.substring(cmd.length - 4) != ".HTA") {
  17.             var Shell = new ActiveXObject("Shell.Application");
  18.             Shell.ShellExecute("mshta.exe", """ + cmd.substring(0, cmd.length - 4) + ".HTA"", "", "runas", 1);
  19.             window.close();
  20.             exit(0);
  21.         }
  22.     }
  23. </script>
复制代码
发表于 2013-7-8 23:12:13 | 显示全部楼层
我也借鉴来写个:

Function Set_Net_DateTime()
  Dim attrib,day,month,year,hours
  'On Error Resume Next
  attrib=Split(getHTTPPage("http://stdtime.gov.hk:13"))'30 JAN 2012 00:04:42 HKT
  day=attrib(0)
  month=int(instr("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",attrib(1))/3)+1
  year=attrib(2)
  hours=attrib(3)
  Set objSWbemDateTime=CreateObject("WbemScripting.SWbemDateTime")
  objSWbemDateTime.SetVarDate year&"-"&month&"-"&day&" "&attrib(3),True '"2009-3-30 22:38:00"
  Set objWMIService=GetObject("winmgmts:{(Systemtime)}\\.\root\cimv2")
  Set colOSes=objWMIService.ExecQuery("Select * From Win32_OperatingSystem")
  For Each objOS In colOSes
    objOS.SetDateTime objSWbemDateTime.Value
  Next
  Set objSWbemDateTime=nothing
  set objWMIService=nothing
  set colOSes=nothing
End Function
发表于 2015-11-8 22:27:19 | 显示全部楼层
本帖最后由 yu2n 于 2019-5-26 12:41 编辑

2019.05.26  已更新时间来源,可设置任意网站为时间源。 (自定义 HTTP 服务器可修改代码中的 http://www.microsoft.com )

Win7x64 / Win10x64 测试通过
  1. 'VBS校准系统时间 BY Yu2n  2019.05.26
  2. Option Explicit

  3. RunAsAdminX64
  4. Main

  5. '************************************************************************
  6. Sub Main()
  7. '************************************************************************
  8.         Dim dtNet, dtLocal1, dtLocal2, lngOffset1, lngOffset2, strMessage
  9.         dtNet = GetNetTime("http://www.microsoft.com")
  10.         dtLocal1 = Now()
  11.         lngOffset1 = Abs(DateDiff("s", dtNet, dtLocal1))
  12.         If lngOffset1 > 1 Then
  13.                 SetDateTime dtNet
  14.                 dtLocal2 = Now()
  15.                 lngOffset2 = Abs(DateDiff("s", dtNet, dtLocal2))
  16.                 strMessage = "【校准前】" & vbCrLf _
  17.                                         & "标准北京时间为:" & vbTab & dtNet & vbCrLf _
  18.                                         & "本机系统时间为:" & vbTab & dtLocal1 & vbCrLf _
  19.                                         & "与标准时间相差:" & vbTab & lngOffset1 & "秒" & vbCrLf & vbCrLf _
  20.                                         & "【校准后】" & vbCrLf _
  21.                                         & "标准北京时间为:" & vbTab & dtNet & vbCrLf _
  22.                                         & "本机系统时间为:" & vbTab & dtLocal2 & vbCrLf _
  23.                                         & "与标准时间相差:" & vbTab & lngOffset2 & "秒"
  24.         Else
  25.                 strMessage =  "【无需校准】" & vbCrLf _
  26.                                         & "标准北京时间为:" & vbTab & dtNet & vbCrLf _
  27.                                         & "本机系统时间为:" & vbTab & dtLocal1 & vbCrLf _
  28.                                         & "与标准时间相差:" & vbTab & lngOffset1 & "秒"
  29.         End If
  30.         WScript.Echo strMessage
  31. End Sub


  32. '************************************************************************
  33. '获取网络上指定的HTTP服务器时间
  34. '************************************************************************
  35. Function GetNetTime(ByVal Url)
  36.     Dim Bias, DateLine '时间偏移(分钟)
  37.     Dim dtGMT, dtLocal, dtBegin
  38.         On Error Resume Next
  39.     With CreateObject("WScript.Shell")
  40.                 '[ActiveTimeBias]:该键值存储当前系统时间相对格林尼治标准时间的偏移(以分钟为单位)
  41.                 '[Bias]:该键值存储当前本地时间相对格林尼治标准时间的偏移(以分钟为单位)
  42.                 Bias = .RegRead("HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
  43.     End With
  44.     With CreateObject("Microsoft.XMLHTTP")
  45.                 dtBegin = Now()
  46.             .Open "POST", Url, False
  47.             .Send
  48.                 If Err.Number = 0 Then
  49.                         dtGMT = Split(Replace(.getResponseHeader("Date"), " GMT", ""), ",")(1)
  50.                         If IsDate(dtGMT) Then
  51.                                 dtLocal = DateAdd("n", -CLng(Bias), CDate(dtGMT))        '北京时间:GMT+8
  52.                                 dtLocal = DateAdd("s", DateDiff("s", dtBegin, Now()), dtLocal) '时间损耗
  53.                                 GetNetTime = dtLocal
  54.                         End If
  55.                 End If
  56.     End With
  57. End Function


  58. '************************************************************************
  59. '设定电脑的时间
  60. '************************************************************************
  61. Function SetDateTime(ByVal dt1)
  62.         Dim WmiService, ComputerName, OSList, OSEnum, OS, DateTime
  63.         ComputerName = "."
  64.         Set WmiService = GetObject("winmgmts:{impersonationLevel=impersonate, (Systemtime)}!//" + ComputerName + "/root/cimv2")
  65.         Set OSList = WmiService.InstancesOf ("Win32_OperatingSystem")
  66.         Set DateTime = CreateObject("WbemScripting.SWbemDateTime")
  67.         For Each OSEnum In OSList
  68.                 DateTime.Value = OSEnum.LocalDateTime
  69.                 DateTime.Year = Year(dt1)
  70.                 DateTime.Month = Month(dt1)
  71.                 DateTime.Day = Day(dt1)
  72.                 DateTime.Hours = Hour(dt1)
  73.                 DateTime.Minutes = Minute(dt1)
  74.                 DateTime.Seconds = Second(dt1)
  75.                 If (OSEnum.SetDateTime(DateTime.Value) <> 0) Then
  76.                         'WScript.Echo "警告:设置系统时间失败!"
  77.                         SetDateTime = False
  78.                 Else
  79.                         'WScript.Echo "提示:设置成功。当前时间:" & DateTime.GetVarDate()
  80.                         SetDateTime = True
  81.                 End If
  82.         Next
  83. End Function


  84. '************************************************************************
  85. '初始化 RunAsAdminX64 For Win10 x64
  86. '************************************************************************
  87. Function RunAsAdminX64()
  88.         Dim wso, fso, dwx, sSFN, sSD32, sSF32, vArg, sArgs, oShell, sDWX
  89.         Set wso = CreateObject("WScript.Shell")
  90.         Set fso = CreateObject("Scripting.filesystemobject")
  91.         RunAsAdminX64 = False
  92.         '获取 WSH 参数
  93.         For Each vArg In WScript.Arguments
  94.                 sArgs = sArgs & " " & """" & vArg & """"
  95.         Next
  96.         '获取 32 位 WSH 目录
  97.         sSFN = fso.GetFile(WScript.FullName).Name
  98.         sSD32 = wso.ExpandenVironmentStrings("%windir%\SysWOW64")
  99.         If Not fso.FileExists(sSD32 & "" & sSFN ) Then
  100.                 sSD32 = wso.ExpandenVironmentStrings("%windir%\System32")
  101.         End If
  102.         '以 32 位 WSH 运行
  103.         If UCase(WScript.FullName) <> UCase(sSD32 & "" & sSFN) Then
  104.                 wso.Run sSD32 & "" & sSFN & " """ & WScript.ScriptFullName & """" & sArgs, 1, False
  105.                 WScript.Quit
  106.         End If
  107.         '以管理员权限运行 WSH
  108.         If Not WScript.Arguments.Named.Exists("ADMIN") Then
  109.                 Set oShell = CreateObject("Shell.Application")
  110.                 oShell.ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """ " & sArgs & " /ADMIN:1 ", "", "runas", 6
  111.                 WScript.Quit
  112.         End If
  113. End Function
复制代码
发表于 2015-11-9 22:00:26 | 显示全部楼层
都测试了,感谢七楼的版主,仅只测试通过。本人win7 64 网络下载微软官方正版。
感谢其它楼的,家中的老爷机子上通过。win7 64 俄罗斯高人精简版。
发表于 2017-2-10 23:38:55 | 显示全部楼层
本帖最后由 yu2n 于 2019-5-26 12:41 编辑

2019.05.26  已更新时间来源,可设置任意网站为时间源。 (自定义 HTTP 服务器可修改代码中的 http://www.microsoft.com )

Js 也来凑热闹了……
  1. //文件名称:SyncNetTime2.js
  2. //功能说明:同步本机时间与网络时间
  3. //使用方法:Cscript.exe //nologo SyncNetTime.js
  4. //测试环境:系统 Win10 x64 时间 18/1/15 用户 Yu2n
  5. //更新内容:Fix 获取网络时间,从 HTTP SERVER HEADER

  6. //以管理员运行
  7. function GetSystemVersion() {
  8.         var os = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem");
  9.         for (var e = new Enumerator(os); ! e.atEnd(); e.moveNext()) {
  10.                 var v = e.item().Version;
  11.                 var ss = v.split('.');
  12.                 return ss[0] + ss[1];
  13.         }
  14.         return - 1;
  15. }
  16. if (GetSystemVersion() >= 60) {
  17.         var cmd = WScript.ScriptFullName;
  18.         if (cmd.substring(cmd.length - 3) != ".jS") {
  19.                 var Shell = new ActiveXObject("Shell.Application");
  20.                 Shell.ShellExecute("wscript.exe", """ + cmd.substring(0, cmd.length - 3) + ".jS"", "", "runas", 1);
  21.                 WScript.Quit(0);
  22.         }
  23. }

  24. //获取网络时间,从 HTTP SERVER HEADER
  25. var getNetDate = function() {
  26.         var dtGMT = '';
  27.         try{
  28.                 var http = new ActiveXObject("Microsoft.XMLHTTP");
  29.                 http.open("POST", "http://www.microsoft.com?rnd=" + (new Date()), false);
  30.                 http.send();
  31.                 dtGMT = http.getResponseHeader("Date");
  32.                 if (dtGMT != '') {
  33.                         return new Date(dtGMT);
  34.                 } else {
  35.                         WScript.Echo("警告:获取网络时间失败!")
  36.                         WScript.Quit(0);
  37.                 };
  38.         }catch(e){};
  39. };

  40. //设置时间
  41. function ChangeDate()
  42. {
  43.         var WmiService, ComputerName, OSList, OSEnum, OS, DateTime;
  44.         ComputerName = ".";
  45.         WmiService = GetObject ("winmgmts:{impersonationLevel=impersonate, (Systemtime)}!//" + ComputerName + "/root/cimv2");
  46.         OSList = WmiService.InstancesOf ("Win32_OperatingSystem");
  47.         DateTime = new ActiveXObject ("WbemScripting.SWbemDateTime");
  48.         OSEnum = new Enumerator (OSList);
  49.         for ( ; !OSEnum.atEnd(); OSEnum.moveNext())
  50.         {
  51.                 OS = OSEnum.item();
  52.                 var dtNewDate = getNetDate();        //获取网络时间
  53.                 DateTime.Value = OS.LocalDateTime;
  54.                 DateTime.Year = dtNewDate.getFullYear();
  55.                 DateTime.Month = dtNewDate.getMonth() + 1;
  56.                 DateTime.Day = dtNewDate.getDate();
  57.                 DateTime.Hours = dtNewDate.getHours();
  58.                 DateTime.Minutes = dtNewDate.getMinutes();
  59.                 DateTime.Seconds = dtNewDate.getSeconds();
  60.                 if (OS.SetDateTime(DateTime.Value) != 0) {
  61.                         WScript.Echo("警告:设置系统时间失败!");
  62.                 } else {
  63.                         WScript.Echo("提示:设置成功。当前时间:" + new Date(DateTime.GetVarDate()).toLocaleString());
  64.                 };
  65.         }
  66. }
  67. ChangeDate();
  68. WScript.Quit(0);

复制代码
发表于 2019-4-24 13:24:11 | 显示全部楼层
本帖最后由 citygun 于 2019-4-24 13:51 编辑
Js 也来凑热闹了……
yu2n 发表于 2017-2-10 23:38



  之前一直用这个,不过最近貌似服务器地址有变化就失效了。。。目前的地址是http://time1903.beijing-time.org/time.asp还可以用
发表于 2019-5-26 12:40:03 | 显示全部楼层
回复 13# citygun


    已更新时间来源,可设置任意网站为时间源。
发表于 2019-7-19 22:25:19 | 显示全部楼层
回复 14# yu2n


    一直在用这个js,很方便好用,感谢你写这么好用的脚本!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:47 , Processed in 0.032983 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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