How to: Convert Local Time to UTC
Windows Management Instrumentation (WMI) functions that use time information, such as the ClearPasswordHistory Method function or the ClearRuns Method function, require that you use Coordinated Universal Time (UTC, also known as Greenwich Mean Time).
The following Microsoft Visual Basic Scripting Edition (VBScript) example converts local time to UTC.
Option Explicit
On Error Resume Next
Set objArgs = WScript.Arguments
Dim convertYear,convertMonth,convertDay,convertHour,convertMin,convertSec,convertMil,AMPM,ToUTC,TimeConst
' Fill In Default settings.
ToUTC = True
TimeConst = "UTC"
AMPM = "am"
convertMil = "000"
LoadArgs
ValidateInput
convertHour = FormatHour(convertHour)
Wscript.Echo ConvertToUTC(convertYear & convertMonth & convertDay & convertHour & convertMin & convertSec) & " " & TimeConst
Function ConvertToUTC(strTime)
On Error Resume Next
' Parses a date time string passing in the following format:
' 20040806065423 - Year Month Day Hour Minutes Seconds.
Dim strDateTime, UTCDate, Computer
Dim YerArg : YerArg = left(strTime,4 )
Dim MonArg : MonArg = mid (strTime,5,2 )
Dim DayArg : DayArg = mid (strTime,7,2 )
Dim HrsArg : HrsArg = mid (strTime,9,2 )
Dim MinArg : MinArg = mid (strTime,11,2)
Dim SecArg : SecArg = mid (strTime,13,2)
' Use Win32_ComputerSystem CurrentTimeZone property, because it automatically adjusts the
' Time Zone bias for daylight saving time; Win32_Time Zone Bias property does not.
' Get the computer’s current time zone offset.
For Each LocalTimeZone in GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem")
TimeZoneOffset = LocalTimeZone.CurrentTimeZone
Next
' Wscript.Echo "The current time difference is " & TimeZoneOffset & " minutes (" & TimeZoneOffset/60 & " hrs)"
strDateTime = MonArg & "-" & DayArg & "-" & YerArg & " " & HrsArg & ":" & MinArg & ":" & SecArg
if TimeZoneOffset < 0 Then
if ToUTC then
UTCDate = DateAdd("n", ABS(TimeZoneOffset), strDateTime)
else
UTCDate = DateAdd("n", -ABS(TimeZoneOffset), strDateTime)
end if
else
if ToUTC then
UTCDate = DateAdd("n", -ABS(TimeZoneOffset), strDateTime)
else
UTCDate = DateAdd("n", ABS(TimeZoneOffset), strDateTime)
end if
end if
If Err.Number <> 0 Then
Wscript.Echo "ConvertToUTC::Invalid Argument"
Usage
End If
ConvertToUTC = Trim(Year(UTCDate) & "-" & FormatArgs(Month(UTCDate)) & "-" & FormatArgs(Day(UTCDate)) & " " & FormatArgs(Hour(UTCDate)) & ":" & FormatArgs(Minute(UTCDate)) & ":" & FormatArgs(Second(UTCDate))) & "." & convertMil
End Function
Sub Usage
Wscript.Echo vbCrLf & "cscript ConvertUTC.vbs [Year Month Day] [Hour Min Sec [MilSec]] [AM/PM] [U/L]"
Wscript.Echo vbCrLf & "Year Year"
Wscript.Echo "Month Month"
Wscript.Echo "Day Day"
Wscript.Echo "Hour Hour"
Wscript.Echo "Min Minutes"
Wscript.Echo "Sec Seconds"
Wscript.Echo "MilSec Milliseconds [000 default]"
Wscript.Echo "AM/PM For non 24 hour time specify AM or PM [AM default]"
Wscript.Echo "U/L Specify the direction for the conversion:"
Wscript.Echo " U = Local time to UTC time [default]"
Wscript.Echo " L = UTC time to local time" & vbcrlf
Wscript.Echo vbCrLf & "Usage Examples:"
Wscript.Echo "1) cscript ConvertUTC.vbs U or cscript ConvertUTC.vbs"
Wscript.Echo "2) cscript ConvertUTC.vbs L"
Wscript.Echo "3) cscript ConvertUTC.vbs 2004 12 31 5 55 55 p"
Wscript.Echo "3) cscript ConvertUTC.vbs 2004 12 31 17 55 55 123 u"
Wscript.Echo "4) cscript ConvertUTC.vbs 17 55 55 l"
Wscript.Echo "5) cscript ConvertUTC.vbs 17 55 55 u"
Wscript.Echo "6) cscript ConvertUTC.vbs 5 55 55 123 p u"
Wscript.Echo vbCrLf & "Results:" & vbcrlf & "1) Converts Local now to UTC now [2004-08-11 23:22:19.000 UTC ]"
Wscript.Echo "2) Converts UTC now to Local now [2004-08-11 09:22:19.000 Local]"
Wscript.Echo "3) 2005-01-01 00:55:55.000 UTC"
Wscript.Echo "4) 2004-08-11 10:55:55.000 Local"
Wscript.Echo "5) 2004-08-12 00:55:55.000 UTC"
Wscript.Echo "6) 2004-08-12 00:55:55.123 UTC"
Wscript.Quit(1)
End Sub
Sub LoadArgs
On Error Resume Next
if objArgs.Count > 0 Then
If IsNumeric(objArgs(0)) Then
if Len(objArgs(0)) = 4 Then
convertYear = CheckYear (objArgs(0))
convertMonth = FormatArgs(objArgs(1))
convertDay = FormatArgs(objArgs(2))
convertHour = FormatArgs(objArgs(3))
convertMin = FormatArgs(objArgs(4))
convertSec = FormatArgs(objArgs(5))
If objArgs.Count >= 7 then
if IsNumeric(objArgs(6)) Then
convertMil = FormatMil (objArgs(6))
Else
SetValues(objArgs(6))
end if
End if
If objArgs.Count >= 8 then SetValues(objArgs(7))
If objArgs.Count = 9 then SetValues(objArgs(8))
If Err.Number <> 0 Then
WScript.Echo "LoadArgs::Invalid arguments"
Usage
End If
Else
' Did not pass in Year Month Day arguments just time.
LoadDefaults
convertHour = FormatArgs(objArgs(0))
convertMin = FormatArgs(objArgs(1))
convertSec = FormatArgs(objArgs(2))
If objArgs.Count >= 4 then
If IsNumeric(objArgs(3)) Then
convertMil = FormatMil (objArgs(3))
Else
SetValues(objArgs(3))
End If
End if
If objArgs.Count >= 5 then SetValues(objArgs(4))
If objArgs.Count = 6 then SetValues(objArgs(5))
End If
Else
' First Argument IS NOT numerical value.
LoadDefaults
SetValues(objArgs(0))
End If
Else
' Nothing passed as args.
LoadDefaults
End If
End Sub
Function FormatHour(ArgVal)
Select Case AMPM
Case "pm"
If convertHour < 12 Then ArgVal = convertHour + 12
Case "am"
If convertHour = 12 Then ArgVal = "00"
End Select
FormatHour = ArgVal
End Function
Sub SetValues(Arg)
Dim SetVal : SetVal = Flase
Select Case Left(lcase(arg),1)
Case "u"
TimeConst = "UTC"
ToUTC = True
SetVal = True
Case "l"
TimeConst = "Local"
ToUTC = False
SetVal = True
Case "a"
AMPM = "am"
SetVal = True
Case "p"
AMPM = "pm"
SetVal = True
End Select
If IsNumeric(Left(arg,1)) or Not SetVal Then
WScript.Echo "SetValues::Invalid arguments"
Usage
End If
End Sub
Sub LoadDefaults
CurTime = Now
convertYear = Year(CurTime)
convertMonth = FormatArgs(Month(CurTime))
convertDay = FormatArgs(Day(CurTime))
convertHour = FormatArgs(Hour(CurTime))
convertMin = FormatArgs(Minute(CurTime))
convertSec = FormatArgs(Second(CurTime))
ToUTC = True
End Sub
Sub ValidateInput
Dim ValErr
ValErr = 0
If convertHour > 23 Then ValErr = 1
If convertDay > 31 Then ValErr = 1
If convertMonth > 12 Then ValErr = 1
If convertMin > 59 Then ValErr = 1
If convertSec > 59 Then ValErr = 1
If ValErr > 0 Then
WScript.Echo "ValidateInput::Invalid arguments"
Usage
End if
End Sub
Function FormatArgs(str)
if Len(str) < 2 Then str = "0" & str
FormatArgs = str
If not IsNumeric(str) Then
WScript.Echo "FormatArgs::Invalid arguments"
Usage
End If
End Function
Function CheckYear(str)
CheckYear = str
If not IsNumeric(str) or Len(str) <> 4 Then
WScript.Echo "CheckYear::Invalid arguments"
Usage
End If
End Function
Function FormatMil(str)
tStr = str
if Len(str) < 3 Then
for i = Len(str) + 1 to 3
tStr = tStr+ "0"
Next
end if
if Len(tStr) > 3 then tStr = Left(tStr,3)
FormatMil = tStr
If not IsNumeric(tStr) Then
WScript.Echo "FormatMil::Invalid arguments"
Usage
End If
End Function
Sub ErrorHandler (ErrorMessage)
WScript.Echo ErrorMessage
WScript.Quit(1)
End Sub
See Also
Concepts
Password Synchronization
WMI Provider Overview
Using the WMI Provider