首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

VBScript 顯示標準 ISO 日期時間與系統校時腳本

     編輯:更多程式設計知識

VBScript 可輕鬆格式化輸出符合 ISO 8601 標準的日期時間(YYYY-MM-DD HH:NN:SS),並結合 Windows 時間服務或網路 API 實現系統校時。本文提供兩支實用腳本:Date2ISO.vbs 格式化輸出,與 SyncTime.vbs 自動對時。

腳本一:Date2ISO.vbs - 格式化輸出 ISO 時間


Option Explicit

Dim dtmDate, blnDate, blnTime, strISO
Dim args, i

' 1. 解析參數
Set args = WScript.Arguments.Unnamed
If args.Count = 0 Then
    dtmDate = Now
    blnDate = True
    blnTime = True
Else
    ' 組合日期時間字串
    dtmDate = args(0)
    If args.Count > 1 Then dtmDate = dtmDate & " " & args(1)
    If args.Count > 2 Then dtmDate = dtmDate & " " & args(2)
    
    On Error Resume Next
    dtmDate = CDate(dtmDate)
    If Err.Number <> 0 Or Not IsDate(dtmDate) Then
        Call ShowSyntax
    End If
    On Error GoTo 0
    
    ' 處理 /D /T 開關
    blnDate = True
    blnTime = True
    For i = 0 To WScript.Arguments.Named.Count - 1
        Select Case LCase(WScript.Arguments.Named(i))
            Case "d": blnTime = False
            Case "t": blnDate = False
        End Select
    Next
End If

' 2. 格式化:零補齊輔助函數
Function Fmt(n)
    If n < 10 Then Fmt = "0" & n Else Fmt = CStr(n)
End Function

Dim y, m, d, h, n, s
y = Year(dtmDate)
m = Fmt(Month(dtmDate))
d = Fmt(Day(dtmDate))
h = Fmt(Hour(dtmDate))
n = Fmt(Minute(dtmDate))
s = Fmt(Second(dtmDate))

If blnDate Then strISO = y & "-" & m & "-" & d
If blnTime Then
    If blnDate Then strISO = strISO & " "
    strISO = strISO & h & ":" & n & ":" & s
End If

WScript.Echo strISO

Sub ShowSyntax
    WScript.Echo "Date2ISO.vbs - 輸出 ISO 8601 日期時間" & vbCrLf & _
    "用法: CSCRIPT //NoLogo Date2ISO.vbs [date] [time] [/D|/T]" & vbCrLf & _
    "  /D  僅輸出日期" & vbCrLf & _
    "  /T  僅輸出時間"
    WScript.Quit 1
End Sub

使用範例


C:\> cscript //nologo Date2ISO.vbs
2024-12-15 14:30:05

C:\> cscript //nologo Date2ISO.vbs 2024-01-01 00:00:00
2024-01-01 00:00:00

C:\> cscript //nologo Date2ISO.vbs /D
2024-12-15

C:\> cscript //nologo Date2ISO.vbs /T
14:30:05

腳本二:SyncTime.vbs - 從網路 API 校準系統時間

原理:呼叫百度開放時間 API (https://open.baidu.com/special/time/) 取得毫秒級時間戳,對比本地時間,差異超過 1 秒則呼叫 cmd /c date 與 cmd /c time 修正(需管理員權限)。


Option Explicit

Dim objXML, url, response, localNow, bjTime, diffSec
Dim objReg, matches, timestamp, baseTime, msg

' 1. 取得網路標準時間 (百度 API 回傳 JS: window.baidu_time(1704038400123);)
Set objXML = CreateObject("MSXML2.XMLHTTP")
url = "https://open.baidu.com/special/time/"
objXML.open "GET", url, False
objXML.send
Do Until objXML.readyState = 4 : WScript.Sleep 200 : Loop
response = objXML.responseText

' 2. 正則提取 13 位毫秒時間戳
Set objReg = New RegExp
objReg.Global = True
objReg.Pattern = "window\.baidu_time\((\d{13,})\)"
Set matches = objReg.Execute(response)
If matches.Count = 0 Then
    WScript.Echo "無法解析網路時間回應"
    WScript.Quit 1
End If
timestamp = CLng(matches(0).SubMatches(0)) / 1000  ' 轉秒

' 3. 換算為北京時間 (UTC+8)
baseTime = "1970-01-01 08:00:00"
bjTime = DateAdd("s", timestamp, baseTime)
localNow = Now()
diffSec = DateDiff("s", localNow, bjTime)

' 4. 判斷是否需校時
If Abs(diffSec) < 1 Then
    WScript.Echo "系統時間準確,無需校準。差異: " & diffSec & " 秒"
    WScript.Quit 0
End If

' 5. 執行校時 (需管理員權限)
Dim objShell, newDate, newTime, ampm, hh
Set objShell = CreateObject("WScript.Shell")
newDate = DateAdd("s", diffSec, Now())
newTime = TimeValue(newDate)

' 處理 12 小時制 AM/PM -> 24 小時制
If InStr(newTime, "上午") > 0 Or InStr(newTime, "下午") > 0 Then
    ' 中文系統格式: "下午 02:30:15"
    Dim parts, tparts, h24
    parts = Split(newTime, " ")
    tparts = Split(parts(1), ":")
    h24 = CInt(tparts(0))
    If parts(0) = "下午" And h24 <> 12 Then h24 = h24 + 12
    If parts(0) = "上午" And h24 = 12 Then h24 = 0
    newTime = h24 & ":" & tparts(1) & ":" & tparts(2)
End If

objShell.Run "cmd /c date " & DateValue(newDate), False, True
objShell.Run "cmd /c time " & newTime, False, True

' 6. 驗證結果
WScript.Sleep 1000
Dim newDiff
newDiff = Abs(DateDiff("s", Now(), bjTime))
msg = "【校準前】" & vbCrLf & _
      "標準北京時間: " & bjTime & vbCrLf & _
      "本機系統時間: " & localNow & vbCrLf & _
      "時間差: " & Abs(diffSec) & " 秒" & vbCrLf & vbCrLf & _
      "【校準後】" & vbCrLf & _
      "本機系統時間: " & Now() & vbCrLf & _
      "剩餘差異: " & newDiff & " 秒"
WScript.Echo msg

注意事項與限制

項目說明
管理員權限修改系統時間需以管理員身分執行 cscript SyncTime.vbs。
API 依賴百度 API 可能變更或失效;生產環境建議改用 NTP (w32tm) 或內部時間伺服器。
時區處理腳本假設目標為北京時間 (UTC+8);跨時區部署需調整 baseTime。
12/24 小時制中文版 Windows 使用「上午/下午」;英文版為 AM/PM。腳本已處理中文情況。
2038 年問題VBScript DateAdd 使用 32 位整數,2038 年後可能溢位。

更好的替代方案:Windows 原生時間同步


' 命令列一鍵同步 (需管理員)
w32tm /resync /rediscover

' 或設定固定 NTP 伺服器
w32tm /config /manualpeerlist:"time.windows.com,0x9 pool.ntp.org" /syncfromflags:manual /update

現代 Windows 內建 w32time 服務,配合群組原則或排程任務即可實現可靠自動校時,無需自寫 VBScript。

儘管 VBScript 屬於老技術,但在無法安裝新軟體、需相容 XP/Server 2003 的舊環境中,上述腳本仍具實用價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved