Search code examples
vbscripttimezonewmiutctimezone-offset

Determine my time zone offset using VBScript?


How can I determine my time zone offset using VBScript?

The Windows OS provides the TZ environment variable. For Eastern Standard Time (New York), its value is EST5EDT. However, I am looking for the signed integer offset from UTC. (This is -5 for Eastern Standard Time.)


Solution

  • Here is a revised function that appears to account for Daylight Saving Time. (Inspired by this SO question.)

    Function GetTimeZoneOffset()
        Const sComputer = "."
    
        Dim oWmiService : Set oWmiService = _
            GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
                      & sComputer & "\root\cimv2")
    
        Set cItems = oWmiService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
    
        For Each oItem In cItems
            GetTimeZoneOffset = oItem.CurrentTimeZone / 60
            Exit For
        Next
    End Function
    

    [Original function that does NOT account for Daylight Saving Time.]

    Here is my answer to my question (original source).

    For Eastern Standard Time (New York), this VBScript function will return -5:

    Function GetTimeZoneOffset()
        Const sComputer = "."
    
        Dim oWmiService : Set oWmiService = _
            GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
                      & sComputer & "\root\cimv2")
    
        Dim cTimeZone : Set cTimeZone = _
            oWmiService.ExecQuery("Select * from Win32_TimeZone")
    
        Dim oTimeZone
        For Each oTimeZone in cTimeZone
            GetTimeZoneOffset = oTimeZone.Bias / 60
            Exit For
        Next
    End Function