Office: Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt

Helfe beim Thema Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Gibt es eine Möglichkeit die Universale Time Zone UTC - oder auch ZULU genannt - in Access anzeigen zu lassen? Bräuchte eine Möglichkeit die Windows... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Schlauchi, 2. April 2009.

  1. Schlauchi Erfahrener User

    Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt


    Gibt es eine Möglichkeit die Universale Time Zone UTC - oder auch ZULU genannt - in Access anzeigen zu lassen?

    Bräuchte eine Möglichkeit die Windows SystemZeit auszulesen - und diese dann (auch Winter Sommerzeit) in UTC anzeigen zu lassen. Da Daten aus verschiedenen Ländern gesammelt werden - sollten alle in der gleichen Zeitzone arbeiten können.

    Idee??

    Auch dessen Anzeige wäre mir wichtig.

    Danke
    Björn
     
    Schlauchi, 2. April 2009
    #1
  2. Exl121150 Erfahrener User
    Hallo Björn,

    der Offset (=Bias) der lokalen Zeit am betreffenden PC zur UTC kann aus dem Windows-Registry-Eintrag

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias

    (vom Typ REG_DWORD, also 4-Byte Ganzzahl mit Vorzeichen) ausgelesen werden. Die Angabe ist die Zeitverschiebung in Minuten.

    Dabei gilt die Formel: UTC = LokalePCZeit + ActiveTimeBias
    Bei meinem PC ist da gerade enthalten: FF FF FF 88 (hexadez.)
    was ins Dezimalsystem übertragen, entspricht: -120 (Minuten)
    d.h. z.B. UTC 15:00 Uhr entspricht Lokalzeit 17:00 Uhr
     
    Exl121150, 3. April 2009
    #2
  3. Exl121150 Erfahrener User
    Hallo Björn,

    ich habe Dir für die Abfrage und Rückgabe des obigen Registry-Keys eine Funktion gebastelt:

    Code:
    Declare Function RegOpenKeyEx Lib "AdvApi32.dll" Alias "RegOpenKeyExA" _
                    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
                     ByVal samDesired As Long, phkResult As Long) As Long
    Declare Function RegQueryValueEx Lib "AdvApi32.dll" Alias "RegQueryValueExA" _
                     (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
                     lpType As Long, lpData As Any, lpchData As Any) As Long
    Declare Function RegCloseKey Lib "AdvApi32.dll" (ByVal hKey As Long) As Long
    
    
    Function Get_REG_DWORD(Root As Long, Key As String, Field As String, ByRef Value As Long) As Boolean
      Const KEY_READ = &H1 Or &H8 Or &H10 'KEY_QUERY_VALUE+KEY_ENUMERATE_SUB_KEYS+KEY_NOTIFY
      Dim keyHandle As Long, dwType As Long, PufferGröße As Long
      On Error GoTo Err_Get_REG_DWORD
      
      Get_REG_DWORD = False
      
    ' --- Öffnen des Schlüssels
      If RegOpenKeyEx(Root, Key$, 0, KEY_READ, keyHandle) <> 0 Then Err.Raise 6
    ' --- Abfragen Typ und Puffergröße
      If RegQueryValueEx(keyHandle, Field$, 0&, dwType, ByVal 0&, PufferGröße) <> 0 Then Err.Raise 6
    ' --- Abfragen Wert (REG_DWORD)
      If RegQueryValueEx(keyHandle, Field$, 0&, dwType, Value, PufferGröße) <> 0 Then Err.Raise 6
      
      Get_REG_DWORD = True
      
    Err_Get_REG_DWORD:
      RegCloseKey keyHandle
    End Function
    
    Function GetActOffset2UTC() As Single
      Const HKEY_LOCAL_MACHINE = &H80000002
      Const Key$ = "SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
      Const Field$ = "ActiveTimeBias"
      Dim Offs As Long, IstOffsetOk As Boolean
    ' ----
      IstOffsetOk = Get_REG_DWORD(HKEY_LOCAL_MACHINE, Key, Field, Offs)
      GetActOffset2UTC = Offs / 60!
    
    End Function
    Aufgerufen wird sie wie eine normale Funktion mit GetActOffset2UTC() mit leeren Parameterklammern und sie liefert die Zeitverschiebung zur UTC (Einheit: Stunden) zurück, was im Falle meines PCs eine -2 ergibt. Typ des Rückgabewertes: 32bit-Gleitkommazahl (=Single), da auch halbe Stunden und Ähnliches möglich sein muss.
    Formel für die UTC wie gehabt: UTC = LokalePCZeit + GetActOffset2UTC()

    Falls eine andere Zeiteinheit gewünscht ist, bitte einfach die vorletzte Codezeile entsprechend anpassen:
    Code:
     GetActOffset2UTC = Offs / 60!
    Die Variable 'Offs' enthält die Zeitverschiebung in Minuten (32bit-Integer mit Vorzeichen). Das Rufzeichen nach 60 bedeutet, dass 60 eine 32bit-Gleitkommazahl ist.

    Zur Installation: obigen Code am besten mit der Maus markieren, in die Zwischenablage kopieren und in ein allgem. Codemodul einfügen (also nicht in ein Klassen-Codemodul für ein Formular, Bericht,... )
     
    Exl121150, 3. April 2009
    #3
  4. Schlauchi Erfahrener User

    Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt

    -2... und weiter?

    Hallo Exl121150 ,

    erst mal vielen lieben Dank für den ausführlichen Beitrag... Jetzt verstehe ich auch wie ich Infos aus der Registry bekomme.

    Soweit so gut - habe zwar auch meinen Wert von derzeit "-2" Std bzw. -120 Min. aber meine Realzeit möchte das nicht abziehen.

    Ich habe ein Feld da wird die Jetzt() bzw. Now() Zeit als HH:MM angezeigt. Dieses wird alle 15 Sek durch die Timer Funktion aktualisiert.

    Wenn ich jetzt ein Feld habe wie z. B. UTC = Now + GetActOffset2UTC() dann bekomme ich trotzdem noch die "richtige" Zeit angezeigt. Entweder es werden aus -2 - einfach Sekunden... auch wenn ich den Faktor / 60! rausnehme - dann kommt da das gleiche raus.

    Test halber habe ich mir mal eine extra Text Box bemacht und mir nur GetActOffset2UTC anzeigen lassen - es ist eben immer ein Negativer Wert ... logisch weil ja UTC in unserer Zeitzone derzeit 2 Stunden "früher" ist.

    Die zusammen Führung der zwei Werte Now() und GetActOffset2UTC() führt sie aber scheinbar nicht zusammen - sondern macht aus Negativen Werten rechnerisch "0"

    Hab da schon alle Möglichen Kombinationen die mir einfallen versucht (z. B. Format festlegen) - und hier ist mir aufgefallen - das "Short Time" als kleinstes immer nur NULL sein kann....

    Wie bekomme ich nun die 2 Stunden abgezogen???

    Danke
    Björn
     
    Schlauchi, 5. April 2009
    #4
  5. Exl121150 Erfahrener User
    Hallo Björn,

    Dein Kampf mit den beiden Funktionen Now() und GetActOffset2UTC() war deswegen aussichtslos, weil beide mit 2 unterschiedlichen Zeiteinheiten rechnen:
    a) Now() hat als Zeiteinheit 'Tag', während 'GetActOffset2UTC() die Einheit 'Stunde' hat.
    b) Also um eine korrekte Anzeige in einem Feld auf Datum/Zeit-Basis zu bekommen, muss gerechnet werden: =Now()+GetActOffset2UTC()/24
    oder Du stellt das gleich in der vorletzten Codezeile von 'GetActOffset2UTC()' um, indem Du dort statt durch 60 gleich mit durch 1440 dividieren lässt (einen genaueren Wert wirst Du wahrscheinlich mit vorgenannter Division durch 24 bekommen).
    c) Zur Erklärung: alle Datum/Zeit-Felder in Excel, Access teilen jedem Tag (beginnend bei einem Startdatum) eine fortlaufende natürliche Zahl zu. Will man außer der Datumsrechnung zusätzlich Zeitrechnung betreiben, so stellen die Nachkommastellen, die man an so eine Tagesnummer anhängen kann, genau die Bruchteile 1 ganzen Tages dar.
    Wenn ich also zB. ein Datum/Zeit-Feld mit folgendem Inhalt hernehme: 05.04.2009 22:39:55 und mir das als normale Gleitkommazahl anzeigen lasse, erhalte ich 39908,9443865741, wobei 39908 die fortlaufende Nummer des Datums 5.4.2009 ist und 0,9443865741 der Bruchteil eines Tages darstellt:
    wenn ich diesen *24 rechne, erhalte ich die Stunden (22), die Differenz zw. 22 Uhr (=0,916666666) und 0,9443865741 mit *60*24 rechne, erhalte ich die Minuten (=39) usw.
    Dadurch, dass Du vom Now()-Wert minus 2 gerechnet hast, bist Du einfach nur 2 volle Tage in der Zeitrechnung zurückgegangen und hast die Uhrzeit identisch belassen.

    Ich hoffe, ich konnte das Problem hinter Deinem aussichtslosen Kampf mit den beiden Funktionen erklären.
     
    Exl121150, 5. April 2009
    #5
  6. Schlauchi Erfahrener User
    1440 - die Lösung :-)

    Genial! 1440 statt 60 und das Problem hat sich gelöst!!!!

    DANKE!!!

    Allerdings mußte ich die Funktion

    Function GetActOffset2UTC() As Single
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const Key$ = "SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
    Const Field$ = "ActiveTimeBias"
    Dim Offs As Long, IstOffsetOk As Boolean
    ' ----
    IstOffsetOk = Get_REG_DWORD(HKEY_LOCAL_MACHINE, Key, Field, Offs)
    GetActOffset2UTC = Offs / 60!

    End Function

    direkt in mein Formular einbauen. Er wollte es mir nicht aus der "Globalen" Umgebung nehmen. Da ich es derzeit nur für ein Formular brauche... Funktioniert es so bestens. Am anderen wird gearbeitet.

    Danke und Gruß
    Björn
     
    Schlauchi, 5. April 2009
    #6
  7. Exl121150 Erfahrener User
    Hallo Björn,

    wo hast Du die 3 DECLARE-Statements für den Zugriff auf ADVAPI-DLL bzw. die Funktion GET_REG_DWORD(..) ? Ich nehme an ebenfalls in einem allgem. Codemodul. Denn die kann man nirgends sonst platzieren. Wenn diese keine Probleme bereiten, warum soll dann die Funktion GETACTOFFSET2UTC() dort ein Problem sein? Oder wolltest Du sie dort doppelt installieren? Oder was war präzise die Fehlermeldung?
     
    Exl121150, 6. April 2009
    #7
  8. Schlauchi Erfahrener User

    Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt

    Guten Morgen,

    na ich habe erst mal ein Modul mit deinem Code erstellt. Kein Klassenmodul.

    So - wenn ich nun beim öffnen meines Formulars die Funktion raus lasse - also nur im Modul habe bekomme ich folgende Fehlermeldung:

    Compile Error - Expected variable or procedure, not module

    Folgendes wird beim Start/Timer des Formulares ausgelöst:
    -----
    Private Sub Form_Open(Cancel As Integer)

    DoCmd.Maximize
    Dim utctime As Single
    utctime = GetActOffset2UTC

    Me.UTC = utctime

    End Sub
    -----
    Fehler bekomme ich nur wenn ich im gleichen Formular:
    -----
    'Function GetActOffset2UTC() As Single
    ' Const HKEY_LOCAL_MACHINE = &H80000002
    ' Const Key$ = "SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
    ' Const Field$ = "ActiveTimeBias"
    ' Dim Offs As Long, IstOffsetOk As Boolean
    ' ----
    ' IstOffsetOk = Get_REG_DWORD(HKEY_LOCAL_MACHINE, Key, Field, Offs)
    ' GetActOffset2UTC = Offs / 1440!
    'End Function
    ----
    quasi deaktiviere. Wenn ich diesen Code aber im Formular ohne ' schreibe - funktioniert alles prima.

    Aber wenn ich dich richtig verstanden habe .... sollte das nicht so sein.
     
    Schlauchi, 6. April 2009
    #8
  9. Exl121150 Erfahrener User
    Hallo Björn,

    in der Microsoft-Access2007-Hilfe habe ich Folgendes zu diesem Fehler gefunden:
    "Variable oder Prozedur anstelle eines Moduls erwartet
    Im aktuellen Gültigkeitsbereich befindet sich keine Variable oder Prozedur mit diesem Namen, aber es gibt ein Modul mit diesem Namen. Für diesen Fehler gibt es die folgende Ursache und Lösung:
    Der Name eines Moduls wird als Variable oder Prozedur verwendet.
    Überprüfen Sie, ob der Name der Variablen oder Prozedur richtig geschrieben wurde, und sorgen Sie dafür, daß der von Ihnen verwendete Name nicht in einem anderen Modul als Private definiert oder deklariert ist. Ein Modulname kann als Bezeichner verwendet werden, darf jedoch nicht einzeln auftreten."

    Das heißt doch Folgendes: Du hast für die Bezeichnung eines Deiner Module ebenfalls den Namen 'GetActOffset2UTC' gewählt. Nachdem natürlich an der Stelle utctime = GetActOffset2UTC kein Modul, sondern der Bezeichner einer Variablen oder Funktion erwartet wird, bricht der Compiler mit besagter Fehlermeldung ab.
    Das lässt sich leicht überprüfen: im VBA-Editor im Fenster 'Projekt' ist aufgelistet, welche Microsoft Office Access Klassenobjekte bzw. Module vorhanden sind. Befindet sich da der Name 'GetActOffset2UTC' darunter, ist dieser zu ändern (es genügt, wenn 1 Zeichen geändert wird oder dazu/wegkommt). Die Namensänderung erfolgt im Fenster 'Eigenschaften' des VBA-Editors in der Eigenschaft '(Name)' - sie steht ohnehin in der Regel zu oberst als 1. Eigenschaft im Fenster.
    Der Compiler findet die in Modulen enthaltenen Funktionen über die Namen der Funktionen und nicht über den des Moduls, es sei denn, es steht vor der Funktionsdeklaration (also vor dem Wort 'Function') das Wort 'Private' - dann ist diese Funktion nur innerhalb dieses Moduls aufrufbar und nicht von außerhalb des Moduls.

    Ferner ist es besser, wenn Du folgenden Code schreibst: utctime = GetActOffset2UTC() mit der leeren Parameterklammer am Ende. Dadurch weiß ein menschlicher Leser (und auch der Compiler), dass es sich um eine Funktion und um keine einfache Variable handelt.
     
    Exl121150, 6. April 2009
    #9
  10. Schlauchi Erfahrener User
    Gelöst!

    Genau da lag der Fehler... Mein Modul hatte den gleichen Namen. Name vom Modul geändert - und alles läuft.

    Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt :cool: so einfach könnte es doch immer sein

    DANKE
     
    Schlauchi, 6. April 2009
    #10
Thema:

Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt

Die Seite wird geladen...
  1. Zeit in UTC/ZULU anzeigen - je nach Rechner "Aufenthalt - Similar Threads - Zeit UTC ZULU

  2. Zeit Berechnung mit mehreren kriterien (Datum/Uhrzeit)

    in Microsoft Excel Hilfe
    Zeit Berechnung mit mehreren kriterien (Datum/Uhrzeit): Hallo zusammen, leider weiss ich nicht wie ich die Start- und Endzeit von "Datum und Uhrzeit" mit mehreren kriterienin über Summewenns einbauen kann. Hab hier im Forum nach einer Lösung geschaut...
  3. Runden bei Zeiten

    in Microsoft Excel Hilfe
    Runden bei Zeiten: Hallo, ich habe folgendes Problem, wenn ich Zeiten Runden auf 2 Kommastellen gerne hätte kommt immer 00:00,00 heraus =MIN(B4:B9)/100*95 das ist die bisherige Formel, das wird zwar richtig...
  4. Bedingte Formatierung, Leere Zelle ab best. Zeit einfärben und bei Eintrag Farbe weg.

    in Microsoft Excel Hilfe
    Bedingte Formatierung, Leere Zelle ab best. Zeit einfärben und bei Eintrag Farbe weg.: Guten Tag, ich habe, eigentlich, ein simples Problem und bekomme einfach nicht die Funktion korrekt geschrieben. Ich würde gerne eine Bedingte Formatierung durchführen für eine Zelle, die Bezug...
  5. Datum und Zeit aus einer Zelle extrahieren

    in Microsoft Excel Hilfe
    Datum und Zeit aus einer Zelle extrahieren: Moin zusammen, ich habe einen Datenexport gemacht und aus diesem eine Tabelle gemacht. Jetzt habe ich aber als Datum eine Angabe die aus Datum und Zeit in einer Zelle besteht. Beispiel: 2024-01-08...
  6. Sollarbeitszeit mit SVERWEIS

    in Microsoft Excel Hilfe
    Sollarbeitszeit mit SVERWEIS: HiHo Ich stehe mal wieder vor einem (von vielen) Problem(en) bei meiner Exeltabelle. Es geht hierbei um die Sollarbeitszeit. =WENN( ODER(...
  7. Userform mit UTC Zeit

    in Microsoft Excel Hilfe
    Userform mit UTC Zeit: Hallo, ich habe eine Userform wo auch die Aktuelle Uhrzeit dargestellt wird. Nun möchte ich neben der Localen Zeit, dass auch die UTC Zeit mit angezeigt wird ! Jemand eine Idee ? Do...
  8. Outlook Kalender zeigt Termine in Pacific Zeit an

    in Microsoft Outlook Hilfe
    Outlook Kalender zeigt Termine in Pacific Zeit an: Hallo, Mein Setup: Ich habe ein etwas ungewöhnlliches Problem, und zwar habe ich zwei Computer mit Windows 7 Professional und Outlook 2016 installiert. Auf beiden Computern bin ich in Outlook...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden