![]() |
Wie kann man ein DOS Datum in Tdate umwandeln ???
Hallo.
Ich habe eine uralte DOS Anwendung, die Ihre Daten(bank) als Binär Datei speichert. Diese Datei will ich mit Delphi einlesen um es dann weiter zu verarbeiten. String und Integer Werte sind kein Problem, doch wie sieht es mit dem Datum aus? Unter Delphi ist es ja ein Tdate als Double mit 8 Byte (64bit). Wie ist/war das unter DOS/TurboPascal? Ich weiß, das 6BB001hex der 1. Feb. 2003, 6CB001hex der 2. Feb. 2003 und 8D2C02hex der 2. Feb. 1995 (vlt. auch 2095, man kann nur 2 Zahlen eingeben) ist. Wie zu sehen erhöht ein Tag den HexWert auch um Eins. Es scheinen auch die Bytes vertauscht zu sein. Wie kann ich diesen 32Bit Wert in ein TDate umwandeln? Hier noch mal das Datum mit ein paar mehr Byte davor und dahinter. 31 31 6F 00 6B B0 01 00 C8 55 = 1.Feb.2003 31 31 6F 00 6C B0 01 00 C8 55 = 2.Feb.2003 31 31 6F 00 8D 2C 02 00 C8 55 = 2.Feb.1995 Danke, für das lesen :) |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Läßt sich der hex Wert nicht in Integer wandeln ? Und würde der entstehende Integer Wert dem Datum entsprechen ?
:hi: |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Mit TP holst Du das Datum mit
Getdate((yyyy,mm,dd,wd) aus der Unit DOS. Alle Variablen müssen vom Typ WORD sein Gruß Wolfgang |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Zitat:
Zitat:
6BB0 ist z.B. 27568 oder B06B mit Byte Swap ist 45163. Der 1.Feb.2003 ist aber als Integer 37653. Also komm ich da nicht weiter, oder mach ich was falsch? |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
@bodycounter
Zitat:
oder suche mal mit "FreePascal" |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
aus Unit Windows das
![]() [add] FileTime-zu-DateTime macht ![]()
Delphi-Quellcode:
FileTimeToSystemTime(LocalFileTime, LSystemTime);
with LSystemTime do FileDateTime := EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMinute, wSecond, wMilliSeconds); Aber alles egal, da es in SysUtils ein ![]() |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Hab nun herrausgefunden wie die Daten aufgebaut sind.
49 BA 01 00 C4 95 00 00 ist der 1.1.1910 um 10:39Uhr Zu erst kommen 4 byte in Litte Endian als Integer und stellen ganze Tage nach dem 1.1.1600 dar. Danach kommen 4 byte in Litte Endian als Integer und stellt ganze Sekunden nach 00:00 dar. 48ba0100 byte swap = 0001ba48 = 113224 Tage nach 1.1.1600 = 1.1.1910 c4950000 byte swap = 000095c4 = 38340 Sekunden = 639 Minuten = 10:39Uhr Nun meine frage. Ist das irgendein bekannter Standard oder hat sich der Programmiere sich selber was ausgedacht? Danke :) |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Hi!
Wärst du auch so nett, uns es dann mitzuteilen? Grüße, Frederic |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Zitat:
falls es zufällig die selbe Kodierung ist. :angel2: |
Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
Hier meine schnelle eigene Lösung:
Delphi-Quellcode:
Danke für die Tipps :D
function bytes2datetime(const date,time:integer):Tdatetime;
begin result := -109571 + date + (time/86400); // -109571 = 1.1.1600 | 86400 = Sekunden pro Tages end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz