FileSystemObject, File Explorer und Sommerzeit

03. November 2023

In einem meiner Datenbank-Projekte wird bei Änderung gewisser Daten ein Timestamp aktualisiert; alle 10 Minuten läuft eine Funktion, welche für alle Daten mit aktuellem Timestamp eine zugehörige PDF-Datei, die aus einem Datenbank-Bericht erzeugt wird, aktualisiert. Und einmal täglich läuft eine Prüffunktion, welche alle Timestamps mit dem Datum DateLastModified aus dem FileSystemObject für die zugehörigen PDF-Dateien vergleicht und diese ggf. neu erzeugt. 

Ich staunte nicht schlecht, als diese Prüffunktion am Montag, 30. Oktober 2023, jede Menge PDF-Dateien aktualisierte in der Annahme, dass diese zuletzt vor dem Protokolleintrag aktualisiert worden wären, obwohl dies laut Timestamp in der Datenbank und laut Anzeige im File Explorer gar nicht stimmte.

Es stellte sich heraus, dass FileSystemObject die deutsche Sommerzeit nicht berücksichtigt. Sprich: Wenn eine Datei innerhalb der Sommerzeit, z.B. am 20.08.2023 um 12:00 Uhr erstellt wurde, gibt die Eigenschaft .DateLastModified bzw. .DateCreated die Uhrzeit 11:00 Uhr zurück. Vergleicht man diesen Timestamp mit einem Datumseintrag in der Datenbank, der mit der Systemzeit vom 20.08.2023 erstellt wurde, so hat man unter Umständen ein Problem.

Der File Explorer dagegen berücksichtigt die Sommerzeit, d.h. er zeigt für unser Beispiel die Zeit 12:00 Uhr an. Alles andere wäre auch ziemlich verwirrend.

Ich habe nun eine Funktion LocalTime() geschrieben, welche den Timestamp, der von FileSystemObject ermittelt wird, entsprechend der Sommer- bzw. Winterzeit an den File Explorer und auch an die Einträge in der Datenbank anpasst:

Public Function LocalTime(D As Date) As Date

  If InSommerzeit(D) Then
    LocalTime = DateAdd("h", 1, D)
  Else
    LocalTime = D
  End If

End Function


Public Function InSommerzeit(D As Date) As Boolean

Dim Jahr As Integer
Dim dStart As Date, dEnde As Date

  Jahr = Year(D)
    
  dStart = DateSerial(Jahr, 3, 31)
  dStart = dStart - Weekday(dStart) + 1
  
  dEnde = DateSerial(Jahr, 10, 31)
  dEnde = dEnde - Weekday(dEnde) + 1
  
  InSommerzeit = ((dStart <= D) And (D < dEnde))

End Function

Wenn man es ganz genau nehmen würde, müsste man auch die Uhrzeit der Zeitumstellung noch berücksichtigen. Für mich spielt das allerdings keine Rolle, denn meine User sitzen nicht in der Nacht der Zeitumstellung vor dem Rechner und erstellen PDF-Dateien :-)

Kommentare (0)

Keine Kommentare gefunden!

Neuen Kommentar schreiben