Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0340: Zeitzoneninformation ermitteln

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetTimeZoneInformation

Download:

Download des Beispielprojektes [3,21 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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.