VBScript 可輕鬆格式化輸出符合 ISO 8601 標準的日期時間(YYYY-MM-DD HH:NN:SS),並結合 Windows 時間服務或網路 API 實現系統校時。本文提供兩支實用腳本:Date2ISO.vbs 格式化輸出,與 SyncTime.vbs 自動對時。
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
原理:呼叫百度開放時間 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 年後可能溢位。 |
' 命令列一鍵同步 (需管理員)
w32tm /resync /rediscover
' 或設定固定 NTP 伺服器
w32tm /config /manualpeerlist:"time.windows.com,0x9 pool.ntp.org" /syncfromflags:manual /update
現代 Windows 內建 w32time 服務,配合群組原則或排程任務即可實現可靠自動校時,無需自寫 VBScript。
儘管 VBScript 屬於老技術,但在無法安裝新軟體、需相容 XP/Server 2003 的舊環境中,上述腳本仍具實用價值。