13

Does anyone have a simple means in VBScript to get the current time in UTC?

Thanx, Chris

Chris
  • 141
  • 1
  • 1
  • 3

6 Answers6

17

I use a simple technique

Set dateTime = CreateObject("WbemScripting.SWbemDateTime")    
dateTime.SetVarDate (now())
wscript.echo  "Local Time:  " & dateTime
wscript.echo  "UTC Time: " & dateTime.GetVarDate (false)

More info on SWbemDateTime

If you wanted to convert UTC back to local time do this:

Set dateTime = CreateObject("WbemScripting.SWbemDateTime")
        dateTime.SetVarDate now(),false  REM Where now is the UTC date
        wscript.echo cdate(dateTime.GetVarDate (true))
Niederee
  • 4,155
  • 25
  • 38
2

There are lots of examples out there. If you can access the registry this one will work for you:

od = now() 
set oShell = CreateObject("WScript.Shell") 
atb = "HKEY_LOCAL_MACHINE\System\CurrentControlSet\" &_ 
    "Control\TimeZoneInformation\ActiveTimeBias" 
offsetMin = oShell.RegRead(atb) 
nd = dateadd("n", offsetMin, od) 
Response.Write("Current = " & od & "<br>UTC = " & nd)

From http://classicasp.aspfaq.com/date-time-routines-manipulation/how-do-i-convert-local-time-to-utc-gmt-time.html

Display Name is missing
  • 6,197
  • 3
  • 34
  • 46
1

You can get time bias from Win32_TimeZone WMI class.

myDate = "9/4/2013 17:23:08"
For Each objItem In GetObject(_
    "winmgmts:\\.\root\cimv2").ExecQuery(_
    "Select * from Win32_TimeZone")
    bias = objItem.Bias
Next
myDate = DateAdd("n", bias, myDate)
WScript.Echo myDate
seeker
  • 318
  • 3
  • 11
0

With SetVarDate the offset change due to transition to daylight saving time (from +060 to +120) occurred one hour too soon. The RegRead(HKLM\..\ActiveTimeBias) method was spot-on. If reproduction is desired, just put the pc clock on a time just before and just after the expected transition time and check the results.

0

Here is an example that formats the date to UTC as well. Note that you cannot format to a millesecond level with this.

Dim formattedDate 
Dim utcDate

Set objShell = WScript.CreateObject("WScript.Shell")

Set dateTime = CreateObject("WbemScripting.SWbemDateTime")

dateTime.SetVarDate(now())
utcDate = dateTime.GetVarDate(false) 

wscript.echo  "Local Time:  " & dateTime
wscript.echo  "UTC Time: " & utcDate

formattedDate = DatePart("yyyy",utcDate) & "-" & Right("0" & DatePart("m",utcDate), 2) & "-" & Right("0" & DatePart("d",utcDate), 2) 
    & "T" & Right("0" & DatePart("h",utcDate), 2) & ":" & Right("0" & DatePart("n",utcDate), 2) 
    & ":" & Right("0" & DatePart("s",utcDate), 2) & ".000+0000"

wscript.echo formattedDate

'results in a format that looks like this: 1970-01-01T00:00:00.000+0000

set dateTime=Nothing
set objShell=Nothing
smoore4
  • 4,520
  • 3
  • 36
  • 55
0

Based on above functions - returns a delta-value to be added to the current time to return UTC.

Or call it with DATE+TIME to return UTC.

Call it once and store in a global variable to offset any date/time to UTC. Conversely Subtract it from any UTC to get the time in the current time zone.

The additional ROUND towards the bottom is an attempt to compensate for floating point errors in the conversion to the nearest second.

Function Time_add_To_get_UTC(Optional DateTime = 0) ''as double
    '' Returns value to add to current time to get to UTC
    ''Based on above functions : )
    ''return offset from current time to UTC
    ''https://stackoverflow.com/questions/15887700/utc-time-assignment-in-vbscript/22842128
    Dim SWDT    ''As SWbemDateTime
    Dim dt          ''As Date
    
    Set SWDT = CreateObject("WbemScripting.SWbemDateTime")
    
    dt = Date + Time()
    
    SWDT.SetVarDate (dt)
    
    Time_add_To_get_UTC = CDbl(SWDT.GetVarDate(False)) - CDbl(SWDT.GetVarDate(True))
    Time_add_To_get_UTC = CDbl(Round(Time_add_To_get_UTC * 24 * 60 * 60, 0) / 24 / 60 / 60)
    Time_add_To_get_UTC = DateTime + Time_add_To_get_UTC
End Function
Apsis0215
  • 93
  • 1
  • 9