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.

Visual Basic Script  Copy Code
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