VBA Tipp: Unix-Systemdatum wandeln

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte das Unix-Systemdatum (Sekunden seit dem 1.1.1970) in ein Access-Datum (Tage seit dem 30.12.1899) wandeln - bzw. umgekehrt.

Lösung 1

Public Function DateToUnix(UtcDateTime As Date) As Long
   'Quelle: www.dbwiki.net oder www.dbwiki.de
   DateToUnix = DateDiff("s", #1/1/1970#, UtcDateTime)
End Function
 
Public Function UnixToDate(UnixTimeStamp As Long, Optional DateOnly As Boolean) As Date
   'Quelle: www.dbwiki.net oder www.dbwiki.de
   If DateOnly Then
      UnixToDate = CDate(Format$(DateAdd("s", UnixTimeStamp, #1/1/1970#), "dd/mm/yyyy"))
   Else
      UnixToDate = DateAdd("s", UnixTimeStamp, #1/1/1970#)
   End If
End Function

Aufruf

   Debug.Print DateToUnix(CDate("2001-1-1"))   'Ausgabe: 978307200

Lösung 2

Berücksichtigt optional Millisekunden, wie sie z. Bsp. von JavaScript verwendet werden.

Public Function EpochToDate(ByVal Epoch As Currency, Optional msFrac) As Date
   'Quelle: www.dbwiki.net oder www.dbwiki.de
   Const EpochStart As Double = #1/1/1970#
 
   msFrac = 0
   If Epoch > 10000000000@ Then Epoch = Epoch * 0.001: msFrac = Epoch - Int(Epoch)
   EpochToDate = EpochStart + (Epoch - msFrac) / 86400
End Function
 
Public Function DateToEpoch(ByVal UtcDateTime As Date, Optional msFrac) As Currency
   'Quelle: www.dbwiki.net oder www.dbwiki.de
   Const EpochStart As Date = #1/1/1970#
 
   DateToEpoch = Int(CCur((UtcDateTime - EpochStart) * 86400))
   If Not IsMissing(msFrac) Then
      DateToEpoch = DateToEpoch * 1000@ + CLng(msFrac * 1000&)
   End If
End Function

Aufruf

   Dim msFrac As Variant
 
   Debug.Print DateToEpoch(#1/1/2001#)           'Ausgabe: 978307200
   Debug.Print DateToEpoch(#1/1/2001#, msFrac)   'Ausgabe: 978307200000
 
   msFrac = 0.001
   Debug.Print DateToEpoch(#1/1/2001#)           'Ausgabe: 978307200
   Debug.Print DateToEpoch(#1/1/2001#, msFrac)   'Ausgabe: 978307200001
 
   ms = Empty
   Debug.Print EpochToDate(978307200001)         'Ausgabe: 01.01.2001
   Debug.Print EpochToDate(978307200001, msFrac) 'Ausgabe: 01.01.2001
   Debug.Print msFrac                            'Ausgabe: 0,001
Wiki hinweis.png

Anmerkung: Dabei ist ggf. Zeitzonen- und Sommerzeit-Information zu ergänzen. (Die Unix-Zeit ist UTC - also Greenwich-Zeit ohne Sommerzeit!)