![]() |
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
|
|
|
|
|
|
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: [ 441 ]
|
|
|