Tipp 0535 Zeitzonen-Informationen auslesen
Autor/Einsender:
Datum:
  Mathias Schiffer
28.08.2007
Entwicklungsumgebung:   VB 6
Mittels der API-Funktion GetTimeZoneInformation ist es möglich, detaillierte Informationen über die Zeitzoneneinstellungen des Zielrechners Ihrer Anwendung zu erlangen.
Der Rückgabewert der Funktion liefert bereits eine erste interessante Information: Er entspricht TIME_ZONE_ID_DAYLIGHT, wenn aktuell die Sommerzeitphase einer Zeitzone besteht. Die Frage nach einer aktuellen Sommerzeit lässt sich also bereits auf einfachste Weise beantworten:
 
Dim udtTZI As TIME_ZONE_INFORMATION
Dim IstSommerzeit As Boolean
IstSommerzeit = (GetTimeZoneInformation(udtTZI) = _
   TIME_ZONE_ID_DAYLIGHT)
 
Alle weiteren Informationen über die Zeitzone des Anwenders lassen sich dem nach Aufruf der Funktion gefüllten Typ TIME_ZONE_INFORMATION entnehmen:
  • Bias: Die auf Minutenbasis angegebene Basis-Zeitverschiebung einer Zeitzone gegenüber der "Greenwich Mean Time" (GMT) – auch "Universal Time Code" (UTC) genannt –, unabhängig von Sommer- oder Normalzeit.
  • StandardName: Enthält den Klartextnamen der Normalzeit, hierzulande etwa "Westeuropäische Normalzeit".
  • StandardDate: Definiert den Beginn der Normalzeit, sofern die Zeitzone Normal- und Sommerzeit unterscheidet.
  • StandardBias: Gibt Aufschluss über die bei Normalzeit zusätzliche (zur in "Bias" angegebenen) Zeitverschiebung in Minuten gegenüber GMT-Zeit. Gewöhnlicherweise entspricht der Wert in "Bias" bereits der Zeitverschiebung der Normalzeit, so dass dieser Wert meist 0 ist.
  • DaylightName: Enthält den Klartextnamen der Sommerzeit, sofern es in der Zeitzone eine Sommerzeit gibt. Für ein System mit deutschsprachigen Gebietseinstellungen etwa lautet dieser Name "Westeuropäische Sommerzeit".
  • DaylightDate: Definiert den Beginn der Sommerzeit, sofern die Zeitzone Normal- und Sommerzeit unterscheidet.
  • DaylightBias: Enthält die bei Sommerzeit zusätzliche (zur in "Bias" angegebenen) Zeitverschiebung in Minuten gegenüber GMT-Zeit.

Nähere Betrachtung kommt den Werten von StandardDate und DaylightDate zu:

Diese Angaben enthalten keine festen Daten der Zeitübergänge für ein bestimmtes Jahr, sondern den Sommerzeitregelungen entsprechend eine Angabe auf Basis eines Wochentags in einer bestimmten Woche eines definierten Monats, sofern eine Zeitzone zwischen Normal- und Sommerzeit unterscheidet (andernfalls ist der Parameter .wMonth der Angabe gleich 0).
Hierbei wird im Parameter .wMonth der SYSTEMTIME-Struktur der betroffene Monat übermittelt, in .wDayOfWeek findet sich die Angabe des betroffenen Wochentags (beginnend bei 0 für einen Sonntag) und in .wDay ein Wert zwischen 1 und 5, der die Woche im Monat definiert: Die Werte von 1 bis 4 stehen für die erste bis vierte Woche im Monat, während der Wert 5 die letzte Woche eines Monats definiert. Der Beginn der "Westeuropäischen Sommerzeit" etwa ist auf den Sonntag der letzten Woche des Monats März festgelegt: .wMonth = 3 (März), .wDayOfWeek= 0 (Sonntag), wDay=5 (letzte Woche des Monats).
Eine Routine zur Umrechnung dieser Angabe in ein Datum eines bestimmten Jahres finden Sie im Beispielprojekt zu diesem Tipp.
Code im Codebereich des Klassenmoduls TimeZoneInfo
 
Private Const TIME_ZONE_ID_DAYLIGHT As Long = 2&

Private Type SYSTEMTIME        ' Erforderlich für die Deklaration
  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(1 To 64) As Byte
  StandardDate As SYSTEMTIME
  StandardBias As Long
  DaylightName(1 To 64) As Byte
  DaylightDate As SYSTEMTIME
  DaylightBias As Long
End Type

Private Declare Function GetTimeZoneInformation Lib "kernel32" ( _
    ByRef lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

' -------------- ÖFFENTLICHE EIGENSCHAFTEN  ----------------

Public Property Get DaylightSavingExists() As Boolean
  ' Gibt zurück, ob die Zeitzone eine Sommerzeit hat.
  Dim udtTZI As TIME_ZONE_INFORMATION
  Dim RetVal As Long

  RetVal = GetTimeZoneInformation(udtTZI)
  DaylightSavingExists = (udtTZI.DaylightDate.wMonth <> 0)
End Property

Public Property Get DaylightSaving() As Boolean
  ' Gibt zurück, ob Sommerzeit besteht.
  Dim udtTZI As TIME_ZONE_INFORMATION
  Dim RetVal As Long

  RetVal = GetTimeZoneInformation(udtTZI)
  DaylightSaving = (RetVal = TIME_ZONE_ID_DAYLIGHT)
End Property

Public Property Get StandardBias() As Integer
  Dim udtTZI As TIME_ZONE_INFORMATION

  GetTimeZoneInformation udtTZI
  StandardBias = -(udtTZI.Bias + udtTZI.StandardBias)
End Property

Public Property Get DaylightBias() As Integer
  Dim udtTZI As TIME_ZONE_INFORMATION

  GetTimeZoneInformation udtTZI
  DaylightBias = -(udtTZI.Bias + udtTZI.DaylightBias)
End Property

Public Property Get CurrentBias() As Integer
  Dim udtTZI As TIME_ZONE_INFORMATION
  Dim RetVal As Long

  RetVal = GetTimeZoneInformation(udtTZI)

  With udtTZI
    If RetVal = TIME_ZONE_ID_DAYLIGHT Then
      CurrentBias = -(.Bias + .DaylightBias)
    Else
      CurrentBias = -(.Bias + .StandardBias)
    End If
  End With
End Property

Public Property Get DaylightName() As String
  ' Gibt den Klartextnamen der Sommerzeit-Zeitzone zurück.
  Dim udtTZI As TIME_ZONE_INFORMATION
  Dim lNullPos As Integer

  GetTimeZoneInformation udtTZI

  With udtTZI
    If InStr(.DaylightName, vbNullChar) > 0 Then
      DaylightName = Left$(.DaylightName, InStr(.DaylightName, _
         vbNullChar) - 1)
    Else
      DaylightName = .DaylightName
    End If
  End With
End Property

Public Property Get StandardName() As String
  ' Gibt den Klartextnamen der Standardzeit-Zeitzone zurück.
  Dim udtTZI As TIME_ZONE_INFORMATION

  GetTimeZoneInformation udtTZI

  With udtTZI
    If InStr(.StandardName, vbNullChar) > 0 Then
      StandardName = Left$(.StandardName, InStr(.StandardName, _
           vbNullChar) - 1)
    Else
      StandardName = .StandardName
    End If
  End With
End Property

Public Property Get LocalTime() As Date
 ' Gibt die aktuelle Lokalzeit zurück.
  LocalTime = Now
End Property

Public Property Get GMTTime() As Date
  ' Gibt die aktuelle GMT-Uhrzeit zurück.
  GMTTime = DateAdd("n", -CurrentBias(), Now)
End Property

Public Function FirstDateDaylight(Optional ByVal InYear As Long) _
    As Date
  ' Gibt das Startdatum der Sommerzeit zurück.
  Dim udtTZI As TIME_ZONE_INFORMATION

  If InYear = 0 Then InYear = Year(Now)
  GetTimeZoneInformation udtTZI
  FirstDateDaylight = GetTimezoneChangeDate(udtTZI.DaylightDate, _
      InYear)
End Function

Public Function FirstDateStandard(Optional ByVal InYear As Long) _
    As Date
  ' Gibt das Startdatum der Standardzeit zurück.
  Dim udtTZI As TIME_ZONE_INFORMATION

  If InYear = 0 Then InYear = Year(Now)
  GetTimeZoneInformation udtTZI
  FirstDateStandard = GetTimezoneChangeDate(udtTZI.StandardDate, _
       InYear)
End Function

Private Function GetTimezoneChangeDate(Data As SYSTEMTIME, InYear _
    As Long) As Date
  Dim tempDate As Date, MonthFirstWeekday As Long

  With Data
    Select Case .wDay ' Gibt die Woche im Monat an
      Case 1 To 4 ' Wochentag in 1.-4. Woche im Monat
        ' Wochentag des ersten Tages im Monat berechnen
        MonthFirstWeekday = Weekday(DateSerial(InYear, .wMonth, 1))
        ' Den gesuchten Tag ermitteln
        GetTimezoneChangeDate = DateSerial(InYear, .wMonth, _
               .wDayOfWeek - MonthFirstWeekday + .wDay * 7 + 2) + _
               TimeSerial(.wHour, .wMinute, .wSecond)
      Case 5  ' letzter Wochentag im Monat
        ' Letzten Tag des Monats berechnen
        tempDate = DateSerial(InYear, .wMonth + 1, 0)
        ' Zum letzten passenden Wochentag dieses Monats rechnen
        GetTimezoneChangeDate = tempDate + vbSunday - _
               Weekday(tempDate) + TimeSerial(.wHour, _
               .wMinute, .wSecond)
    End Select
  End With
End Function
 
Weitere Links zum Thema
HOWTO: Change Time Zone Information Using Visual Basic
Ländereinstellungen auslesen
TimeServer-Client (Winsock-API)
Hinweis
Dieser Artikel und der Sourcecode wurden von Mathias Schiffer auf MSDN Online veröffentlicht, sie werden hier mit freundlicher Genehmigung des Autors wiedergegeben.
Der Tipp berücksichtigt auch schon die neuesten Änderungen zur Sommerzeit, und das Download-Projekt ist ausführlich kommentiert.

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (8,5 kB) Downloads bisher: [ 450 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Samstag, 26. November 2011