Hexadezimaldatum in lesbares Datum um wandeln

29/08/2008 - 17:46 von Jens Unglaube | Report spam
Hallo,
ich habe da viele Programmdateien im Hexadezimalformat, die ich in Excel
mit VBA einlesen will. Ich habe dafür einen Type erzeugt den ich dann
als Maske mit Get Type auslesen lasse. Strings Integer boolean und
Double funktionieren recht gut. Mein problem ist nun eine 4Byte
Zeichenfolge hinter der sich ein Datum mit Zeit verbirgt. Im Hexeditor
bekomme ich diese Zeit auch angezeigt, aber wie mache ich das in
Excel-VBA? Der Type Date funktioniert nicht.

Ich danke schon mal für die Vorschlàge.

Jens
 

Lesen sie die antworten

#1 Peter Schleif
29/08/2008 - 20:14 | Warnen spam
Jens Unglaube schrieb am 29.08.2008 17:46 Uhr:

ich habe da viele Programmdateien im Hexadezimalformat, die ich in Excel
mit VBA einlesen will. [...] Mein problem ist nun eine 4Byte
Zeichenfolge hinter der sich ein Datum mit Zeit verbirgt. Im Hexeditor
bekomme ich diese Zeit auch angezeigt, aber wie mache ich das in
Excel-VBA? Der Type Date funktioniert nicht.



Könnte es sich dabei um einen 32-bit-Unix-Timestamp handeln?

Falls ja, müsstest Du die vier Bytes in eine Long-Zahl einlesen
(Byte-Reihenfolge beachten) und in eine Excel-Datum-Zeit umrechnen.

Die untenstehende Funktion erledigt das. Sie korrigiert die Zeitzone
(GMT+1) und berücksichtigt alle deutschen Sommerzeiten. Wenn Du nur
aktuelle Datumswerte hast, reicht auch der erste Teil der If-Abfrage
(jahr>96). Siehe auch Links im Code.

Peter

Public Function UnixToExcel(unixtime As Long) As Date

'http://de.wikipedia.org/wiki/Sommer...eutschland
'http://www.ptb.de/de/org/4/44/441/sneu.htm
'http://www.ptb.de/de/org/4/44/441/salt.htm

Dim sommer As Variant
Dim dst As Variant
Dim jahr As Integer

UnixToExcel = CDate(unixtime/86400+25569) + TimeSerial(1,0,0)

jahr = Year(CLng(unixtime / 86400) + 25569.5)

If jahr >= 1996 Then
sommer = Array(Array(1, _
Format(DateValue("31.03." & jahr) _
- (DateValue("30.03." & jahr) Mod 7), _
"dd.mm.yyyy 02:00:00"), _
Format(DateValue("31.10." & jahr) _
- (DateValue("30.10." & jahr) Mod 7), _
"dd.mm.yyyy 02:00:00")))
ElseIf jahr >= 1980 Then
sommer = Array(Array(1, _
Format(DateValue("31.03." & jahr) _
- (DateValue("30.03." & jahr) Mod 7), _
"dd.mm.yyyy 02:00:00"), _
Format(DateValue("31.09." & jahr) _
- (DateValue("30.09." & jahr) Mod 7), _
"dd.mm.yyyy 02:00:00")))
Else
sommer = Array( _
Array(2,"11.05.1947 02:00:00","29.06.1947 01:00:00"), _
Array(1,"30.04.1916 23:00:00","01.10.1916 00:00:00"), _
Array(1,"16.04.1917 02:00:00","17.09.1917 02:00:00"), _
Array(1,"15.04.1918 02:00:00","16.09.1918 02:00:00"), _
Array(1,"01.04.1940 02:00:00","02.11.1942 02:00:00"), _
Array(1,"29.03.1943 02:00:00","04.10.1943 02:00:00"), _
Array(1,"03.04.1944 02:00:00","02.10.1944 02:00:00"), _
Array(1,"02.04.1945 02:00:00","16.09.1945 01:00:00"), _
Array(1,"14.04.1946 02:00:00","07.10.1946 02:00:00"), _
Array(1,"06.04.1947 03:00:00","05.10.1947 02:00:00"), _
Array(1,"18.04.1948 02:00:00","03.10.1948 02:00:00"), _
Array(1,"10.04.1949 02:00:00","02.10.1949 02:00:00"))
End If

For Each dst In sommer
If UnixToExcel >= CDate(dst(1)) - 0.4 / 86400 And _
UnixToExcel < CDate(dst(2)) - 0.4 / 86400 Then
UnixToExcel = UnixToExcel + TimeSerial(dst(0),0,0)
Exit For
End If
Next
End Function

Ähnliche fragen