Board logo

标题: [日期时间] 2021年js和vbs代码可用:网络日期、网络时间,同步到本地电脑上。 [打印本页]

作者: ygqiang    时间: 2021-10-13 16:08     标题: 2021年js和vbs代码可用:网络日期、网络时间,同步到本地电脑上。

本帖最后由 ygqiang 于 2021-12-1 14:28 编辑

2021年。js和vbs代码可用:网络日期、网络时间,同步到本地电脑上。
感谢:Yu2n
系统环境:win7 64
  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
复制代码

作者: ygqiang    时间: 2021-10-13 16:09

  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);
复制代码

作者: flashercs    时间: 2021-12-1 15:33

同步时间应该用w32tm.exe 与时间服务器同步,而不是获取网页response headers中的Date,这Date并不一定代表是当前时间,有可能是proxy代理时间,而且没有计算网络传输的延迟,这不准确。
作者: Batcher    时间: 2021-12-1 15:40

回复 3# flashercs


    非常赞同,不管是Windows还是Linux,首选都应该与时间服务器同步,而不是通过类似这样的脚本。
作者: ygqiang    时间: 2021-12-2 10:10

回复 4# Batcher
回复 3# flashercs

用w32tm.exe 与时间服务器同步,好像就没成功过。也可能是操作问题。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2