VB 5/6-Tipp 0340: Zeitzoneninformation ermitteln
von ActiveVB
Beschreibung
Hier wird Aufschluß über die im System eingestellte Zeitzone gegeben. Nebst der namentlichen Benennung der Zeitzone ist auch zu erkennen, ob derzeit Sommerzeit oder Normalzeit vorherrscht. Darüber hinaus, läßt sich die Abweichung zur GMT-Zeit in Minuten ermitteln.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Schaltfläche "Command1" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label14" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label13" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label12" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label11" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label10" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label8" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label6" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label4" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label2" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label9" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label7" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label5" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label3" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label1" auf Frame1 'Der Tip, speziell die Funktion "GetTimezoneChangeDate", ist der 'Klasse von Mathias Schiffer entnommen. Sie ist unter 'www.microsoft.com/germany/ms/msdnbiblio/quickie/timezone.htm 'als ganzes downloadbar. Option Explicit Private Declare Function GetTimeZoneInformation Lib "kernel32" _ (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long 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 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 Const TIME_ZONE_ID_UNKNOWN As Long = &H0& Const TIME_ZONE_ID_STANDARD As Long = &H1& Const TIME_ZONE_ID_DAYLIGHT As Long = &H2& Dim SommerZeit As Boolean Dim SommerZeitDate As Date Dim SommerZeitName As String Dim SommerZeitGMT As Long Dim NormalZeitDate As Date Dim NormalZeitName As String Dim NormalZeitGMT As Long Private Sub Form_Load() Call DisplayTimeZone End Sub Private Sub Command1_Click() Call DisplayTimeZone End Sub Private Sub DisplayTimeZone() Call GetTimeZone Label2.Caption = SommerZeit Label4.Caption = SommerZeitDate Label6.Caption = NormalZeitDate Label8.Caption = SommerZeitName Label10.Caption = NormalZeitName Label12.Caption = SommerZeitGMT & " Min" Label14.Caption = NormalZeitGMT & " Min" End Sub Private Function GetTimeZone() As Boolean Dim TZI As TIME_ZONE_INFORMATION Dim Result As Long Dim ErrFlag As Boolean Result = GetTimeZoneInformation(TZI) Select Case Result Case TIME_ZONE_ID_UNKNOWN: SommerZeit = False Case TIME_ZONE_ID_STANDARD: SommerZeit = False Case TIME_ZONE_ID_DAYLIGHT: SommerZeit = True Case Else: MsgBox ("Fehler!") Exit Function End Select With TZI SommerZeitDate = GetTimezoneChangeDate(.DaylightDate, _ Year(Now)) NormalZeitDate = GetTimezoneChangeDate(.StandardDate, _ Year(Now)) SommerZeitName = Left$(.DaylightName, InStr(.DaylightName, _ Chr$(0)) - 1) NormalZeitName = Left$(.StandardName, InStr(.StandardName, _ Chr$(0)) - 1) SommerZeitGMT = -(.Bias + .DaylightBias) NormalZeitGMT = -(.Bias + .StandardBias) End With GetTimeZone = True End Function Private Function GetTimezoneChangeDate(Data As SYSTEMTIME, InYear _ As Long) As Date Dim tempDate As Date Dim MonthFirstWeekday As Long 'In Data.wDayOfWeek wird ein Wochentag übergeben. Die 'Information in .wDay legt fest, in welcher Woche des Monats der 'betroffene Tag zu ermitteln ist (1-4) bzw., dass der letzte 'gleiche Wochentag des Monats gemeint ist. With Data 'Gibt die Woche im Monat an Select Case .wDay 'Wochentag in 1.-4. Woche im Monat Case 1 To 4 '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 + 1) + _ TimeSerial(.wHour, .wMinute, _ .wSecond) 'letzter Wochentag im Monat Case 5 'Letzten Tag des Monats berechnen tempDate = DateSerial(InYear, .wMonth + 1, 0) 'Zum letzten passenden Wochentag dieses Monats rechnen GetTimezoneChangeDate = DateAdd("d", tempDate, - _ (Weekday(tempDate) - .wDayOfWeek _ + 7) Mod 7) + TimeSerial(.wHour, _ .wMinute, .wSecond) End Select End With End Function '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Wolfgang Badura am 02.04.2008 um 19:07
Liebe Community,
Habe leider die schon verfaßten Anmerkungen übersehen.
Tut leid.
Kommentar von Wolfgang Badura am 02.04.2008 um 18:13
Die Funktion "GetTimezoneChangeDate(Data As SYSTEMTIME, InYear As Long) As Date" ergibt für 2008 als Zeitpunkt der Sommerzeitumstellung 29.03.2008 02:00:00!!!!
Ruft man unter WinXP SP2, VB60 SP5 GetTimezoneChangeDate mit der Zeitzone "Central European Standard Time" (die Sommerzeit dazu lautet "Central European Daylight Time", das ist für wDayOfWeek.wDay.wMonth, HH:MM:SEC)=0.5.3, 2:0:0) auf, so ergibt sich der oben angeführte falsche Zeitpunkt der Sommerzeitumstellung 29.03.2008 02:00:00!
Kommentar von Arne Gottschalk am 19.01.2007 um 12:14
Hallo
Es gibt einen kleinen Fehler in der Funktion:
In der letzten Zeile muß es heißen
GetTimeZoneChangeDate = DateAdd("d", tempDate, -(Weekday(tempDate, vbUseSystemDayOfWeek) - .wDayOfWeek + 7) Mod 7) + TimeSerial(.wHour, .wMinute, .wSecond)
Ohne vbUseSystemDayOfWeek rechnet die Funktion mit Sonntag als ersten wochentag und gibt auf einem Deutschen Rechner den letzten Samstag im Monat raus.
Viele Grüße
Arne Gottschalk
Kommentar von Lindinger Sepp am 09.07.2005 um 14:54
Ich nochmal,
ich denke bei der Funktion WeekDay gehört jeweils noch der Parameter vbUseSystemDayOfWeek dazu, dann klappt es zumindest bei mir
Kommentar von Lindinger Sepp am 09.07.2005 um 05:26
Hi,
das Beispielprojekt bringt bei mir folgende Werte:
Beginn Sommerzeit: 26.03.2005, 02:00
Beginn Normalzeit: 29.10.2005, 03:00
Lt. <http://zeitumstellung.de/> müsste es aber heissen:
Beginn Sommerzeit: 27.03.2005, 02:00
Beginn Normalzeit: 30.10.2005, 03:00
Liegt das an meinem Rechner, oder stimmt die Berechnung nicht?
Kommentar von Axel am 26.12.2002 um 22:26
Zu meinem Anhaken der CheckBox 'Win98' funzt hier eine Einschränkung:
Offensichtlich hat Microsoft in der DLL einen Fehler fabriziert.
Was unter W2K als Westeuropäische ...zeit angegeben wird, lautet unter Win98:
[MEZ] - Mitteleuropäische Zeit bzw.
[MEZ] - Mitteleurop. Sommerzeit.
Beide Male MEZ kann ja wohl nicht sein.