Hoe te krijgen van de huidige datum / tijd in UTC vanuit een Excel-VBA-macro

Is er een manier in een Excel-VBA-macro om de huidige datum /tijd in UTC-indeling?

Kan ik bellen Now() om de huidige tijd in de lokale tijdzone; is er een generieke manier om de omzetten te UTC?

InformationsquelleAutor Jon | 2009-10-21

 

6 Replies
  1. 11

    http://excel.tips.net/Pages/T002185_Automatically_Converting_to_GMT.html

    Er is een macro op die pagina met een LocalTimeToUTC methode. Lijkt alsof het zou doen de truc. Ook enkele formule voorbeelden als je wilde gaan die weg.

    Bewerken – een Andere link. http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx Deze pagina heeft verschillende methoden voor de datum/tijd. Kies je gif. Ofwel moet het lukken, maar ik heb het gevoel alsof de tweede is mooier. 😉

    • Ugh, maken beiden gebruik van de Windows API-aanroepen, maar als dat de enige manier is dan, dan is dat zo. Bedankt.
  2. 12

    Gewoon, kunt u gebruik maken van COM-Object te bereiken UTC-Tijd van de Informatie.

    Dim dt As Object, utc As Date
    Set dt = CreateObject("WbemScripting.SWbemDateTime")
    dt.SetVarDate Now
    utc = dt.GetVarDate(False)
    • Dat is geweldig! Zal deze factor ZOMERTIJD?? @gogeek
    • UTC geen ZOMERTIJD, maar gezien het huidige lokale tijd kunt u achterhalen van de huidige timezone offset (met inbegrip van DST)
    • Dit moet de aanvaarde antwoord – het is efficiënt, kort, net als code moet worden.
    • Uitstekende code. Wil alleen maar zeggen dat “Nu” kan vervangen worden met een variabele date met datum en tijd, zodat het niet nodig is om de huidige tijd. Het converteren van een datum en tijd in UTC. Bravo gogeek.
  3. 6

    Verleend, deze vraag is al oud, maar ik besteed wat tijd aan het samenstellen van een aantal schone code op basis van dit en wilde ik post het hier, in het geval iedereen die op deze pagina zou het nuttig vinden.

    Maak een nieuwe Module in het Excel-VBA-IDE (optioneel het geven van een naam van UtcConverter of wat uw voorkeur kan worden in het Eigenschappen venster) en te plakken in de code hieronder.

    HTH

    Option Explicit
    
    ' Use the PtrSafe attribute for x64 installations
    Private Declare PtrSafe Function FileTimeToLocalFileTime Lib "Kernel32" (lpFileTime As FILETIME, ByRef lpLocalFileTime As FILETIME) As Long
    Private Declare PtrSafe Function LocalFileTimeToFileTime Lib "Kernel32" (lpLocalFileTime As FILETIME, ByRef lpFileTime As FILETIME) As Long
    Private Declare PtrSafe Function SystemTimeToFileTime Lib "Kernel32" (lpSystemTime As SYSTEMTIME, ByRef lpFileTime As FILETIME) As Long
    Private Declare PtrSafe Function FileTimeToSystemTime Lib "Kernel32" (lpFileTime As FILETIME, ByRef lpSystemTime As SYSTEMTIME) As Long
    
    Public Type FILETIME
      LowDateTime As Long
      HighDateTime As Long
    End Type
    
    Public Type SYSTEMTIME
      Year As Integer
      Month As Integer
      DayOfWeek As Integer
      Day As Integer
      Hour As Integer
      Minute As Integer
      Second As Integer
      Milliseconds As Integer
    End Type
    
    
    '===============================================================================
    ' Convert local time to UTC
    '===============================================================================
    Public Function UTCTIME(LocalTime As Date) As Date
      Dim oLocalFileTime As FILETIME
      Dim oUtcFileTime As FILETIME
      Dim oSystemTime As SYSTEMTIME
    
      ' Convert to a SYSTEMTIME
      oSystemTime = DateToSystemTime(LocalTime)
    
      ' 1. Convert to a FILETIME
      ' 2. Convert to UTC time
      ' 3. Convert to a SYSTEMTIME
      Call SystemTimeToFileTime(oSystemTime, oLocalFileTime)
      Call LocalFileTimeToFileTime(oLocalFileTime, oUtcFileTime)
      Call FileTimeToSystemTime(oUtcFileTime, oSystemTime)
    
      ' Convert to a Date
      UTCTIME = SystemTimeToDate(oSystemTime)
    End Function
    
    
    
    '===============================================================================
    ' Convert UTC to local time
    '===============================================================================
    Public Function LOCALTIME(UtcTime As Date) As Date
      Dim oLocalFileTime As FILETIME
      Dim oUtcFileTime As FILETIME
      Dim oSystemTime As SYSTEMTIME
    
      ' Convert to a SYSTEMTIME.
      oSystemTime = DateToSystemTime(UtcTime)
    
      ' 1. Convert to a FILETIME
      ' 2. Convert to local time
      ' 3. Convert to a SYSTEMTIME
      Call SystemTimeToFileTime(oSystemTime, oUtcFileTime)
      Call FileTimeToLocalFileTime(oUtcFileTime, oLocalFileTime)
      Call FileTimeToSystemTime(oLocalFileTime, oSystemTime)
    
      ' Convert to a Date
      LOCALTIME = SystemTimeToDate(oSystemTime)
    End Function
    
    
    
    '===============================================================================
    ' Convert a Date to a SYSTEMTIME
    '===============================================================================
    Private Function DateToSystemTime(Value As Date) As SYSTEMTIME
      With DateToSystemTime
        .Year = Year(Value)
        .Month = Month(Value)
        .Day = Day(Value)
        .Hour = Hour(Value)
        .Minute = Minute(Value)
        .Second = Second(Value)
      End With
    End Function
    
    
    
    '===============================================================================
    ' Convert a SYSTEMTIME to a Date
    '===============================================================================
    Private Function SystemTimeToDate(Value As SYSTEMTIME) As Date
      With Value
        SystemTimeToDate = _
          DateSerial(.Year, .Month, .Day) + _
          TimeSerial(.Hour, .Minute, .Second)
      End With
    End Function
  4. 4

    Als alles wat je nodig hebt is de huidige tijd, u kunt dit doen met GetSystemTime, waarbij minder Win32 oproepen. Het geeft je een keer struct, met milliseconde precisie, waaruit u kunt opmaken hoe u wilt:

    Private Declare PtrSafe Sub GetSystemTime Lib "Kernel32" (ByRef lpSystemTime As SYSTEMTIME)
    
    Private Type SYSTEMTIME
      wYear As Integer
      wMonth As Integer
      wDayOfWeek As Integer
      wDay As Integer
      wHour As Integer
      wMinute As Integer
      wSecond As Integer
      wMilliseconds As Integer
    End Type

    Gebruik:

    Dim nowUtc As SYSTEMTIME
    Call GetSystemTime(nowUtc) 
    ' nowUtc is now populated with the current UTC time. Format or convert to Date as needed.
  5. 0

    Als u ook nodig hebt om rekening te houden met zomertijd kan je de volgende code handig:

    Option Explicit
    
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Windows API Structures
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Type SYSTEM_TIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
    End Type
    
    Private Type TIME_ZONE_INFORMATION
        Bias As Long
        StandardName(0 To 31) As Integer
        StandardDate As SYSTEM_TIME
        StandardBias As Long
        DaylightName(0 To 31) As Integer
        DaylightDate As SYSTEM_TIME
        DaylightBias As Long
    End Type    
    
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Windows API Imports
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Declare Function GetTimeZoneInformation Lib "kernel32" _
        (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
    
    Private Declare Function TzSpecificLocalTimeToSystemTime Lib "kernel32" _
        (lpTimeZoneInformation As TIME_ZONE_INFORMATION, lpLocalTime As SYSTEM_TIME, lpUniversalTime As SYSTEM_TIME) As Integer
    
    Function ToUniversalTime(localTime As Date) As Date
        Dim timeZoneInfo As TIME_ZONE_INFORMATION
    
        GetTimeZoneInformation timeZoneInfo
    
        Dim localSystemTime As SYSTEM_TIME
        With localSystemTime
            .wYear = Year(localTime)
            .wMonth = Month(localTime)
            .wDay = Day(localTime)
        End With
    
        Dim utcSystemTime As SYSTEM_TIME
    
        If TzSpecificLocalTimeToSystemTime(timeZoneInfo, localSystemTime, utcSystemTime) <> 0 Then
            ToUniversalTime = SystemTimeToVBTime(utcSystemTime)
        Else
            err.Raise 1, "WINAPI", "Windows API call failed"
        End If
    
    End Function
    
    Private Function SystemTimeToVBTime(systemTime As SYSTEM_TIME) As Date
        With systemTime
            SystemTimeToVBTime = DateSerial(.wYear, .wMonth, .wDay) + _
                    TimeSerial(.wHour, .wMinute, .wSecond)
        End With
    End Function
  6. 0

    Mijn Access-project werkt meestal met Toegang tot tabellen die zijn gekoppeld aan een MS SQL Server-tabellen. Het is een DAO project-en ik had moeite om zelfs het krijgen van een SQL sproc met GETUTCDATE() om terug te komen. Maar de volgende was mijn oplossing.

    -- Create SQL table with calculated field for UTCDate
    CREATE TABLE [dbo].[tblUTCDate](
        [ID] [int] NULL,
        [UTCDate]  AS (getutcdate())
    ) ON [PRIMARY]
    GO

    Maken van een Access-tabel, dbo_tblUTCDate, gekoppeld via ODBC-SQL-tabel tblUTCDate.

    Maken van een Access-query selecteren in de Access-tabel. Ik noemde het qryUTCDate.

    SELECT dbo_tblUTCDate.UTCDate FROM dbo_tblUTCDate

    In VBA:

    Dim db as DAO.database, rs AS Recordset
    Set rs = db.OpenRecordset("qryUTCDate")
    Debug.Print CStr(rs!UTCDATE)
    rs.Close
    Set rs = Nothing
    db.Close
    Set db = Nothing

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *