VBA Tipp: Lokale Zeit in UTC und UTC in lokale Zeit wandeln

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Du willst aus einem lokalen Datum/Uhrzeit-Wert die UTC (koordinierte Weltzeit) berechnen bzw. den umgekehrten Weg einschlagen.

Lösung

Die Microsoft WMI Scripting Library stellt für diesen Zweck das Objekt SWbemDateTime bereit. Verwende folgenden Code in einem allgemeinen Modul.

'Quelle: http://www.dbwiki.net/
 
Option Explicit
 
' =============================================================================
' wenn LATE_BINDING auf False gesetzt wird, mmuss ein Verweis auf die
' Microsoft WMI Scripting Library gesetzt sein. Die Ausführung der Methoden
' dürfte dann geringfügig schneller sein.
#Const LATE_BINDING = True
' =============================================================================
 
 
' =============================================================================
#If LATE_BINDING Then
 
   Private dt As Object
 
#Else
 
   Private dt As WbemScripting.SWbemDateTime
 
#End If
' =============================================================================
 
 
' =============================================================================
' Wandelt eine lokale Zeitangabe in die UTC-Zeit (koordinierte Weltzeit) um.
' =============================================================================
Public Function GetUTC(Optional ByVal LocalTime As Variant) As Variant
 
   ' LocalTime:  optional; lokaler Datum/Uhrzeit-Wert oder gültiger
   '             Datum/Uhrzeit-String
   '             Standardwert = VBA.Now() aka Jetzt()
 
 
   If dt Is Nothing Then
      #If LATE_BINDING Then
         Set dt = CreateObject("WbemScripting.SWbemDateTime")
      #Else
         Set dt = New WbemScripting.SWbemDateTime
      #End If
   End If
 
   If IsMissing(LocalTime) Then LocalTime = VBA.Now()
   If IsDate(LocalTime) Then
      dt.SetVarDate LocalTime, True
      GetUTC = dt.GetVarDate(False)
   Else
      GetUTC = Null
   End If
End Function
' =============================================================================
 
 
' =============================================================================
' Wandelt eine UTC-Zeitangabe (koordinierte Weltzeit) in die lokale Zeit um.
' =============================================================================
Public Function GetLocalTime(Optional ByVal UTC As Variant) As Variant
 
   ' UTC:  optional; Datum/Uhrzeit-Wert oder gültige Datum/Uhrzeit-String
   '                 in Weltzeit
   '                 Standardwert = VBA.Now()
 
   If dt Is Nothing Then
      #If LATE_BINDING Then
         Set dt = CreateObject("WbemScripting.SWbemDateTime")
      #Else
         Set dt = New WbemScripting.SWbemDateTime
      #End If
   End If
 
   If IsMissing(UTC) Then
      GetLocalTime = VBA.Now()
   ElseIf IsDate(UTC) Then
      dt.SetVarDate UTC, False
      GetLocalTime = dt.GetVarDate(True)
   Else
      GetLocalTime = Null
   End If
End Function
' =============================================================================
Wiki hinweis.png Hinweis: Das Resultat beider Funktionen muss > 01.01.1601 sein.


Anwendung

Public Sub TestSWbemDateTime()
   Dim localTime As Date
   Dim utcTime   As Date
 
   MsgBox GetUTC()
 
   utcTime = GetUTC(#11/11/2011 11:11:11 AM#)
   MsgBox utcTime
 
   localTime = GetLocalTime(utcTime)
   MsgBox localTime
 
   MsgBox GetUTC("2018-03-06")
   MsgBox GetLocalTime("2018-03-05 01:00")
 
   MsgBox GetUTC("1601-01-01 01:00")
End Sub

In der Beispieldatenbank Datei:Tz 2018 01 23.zip findet die Funktion GetUTC() Verwendung.