Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie kann man ein DOS Datum in Tdate umwandeln ??? (https://www.delphipraxis.net/146880-wie-kann-man-ein-dos-datum-tdate-umwandeln.html)

bodycounter 28. Jan 2010 19:18


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 :)

haentschman 28. Jan 2010 19:24

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:

Wolfgang Mix 28. Jan 2010 19:25

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

bodycounter 28. Jan 2010 19:43

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
Zitat:

Zitat von Wolfgang Mix
Mit TP holst Du das Datum mit
Getdate(h,m,s,htl) aus der Unit DOS.
Alle Variablen müssen vom Typ WORD sein

Ich code in Delphi und nicht in TP. Heiß das, das es keine Extra Datumsvariable unter TP gibt? Und wie sieht es mit DOS aus? gab es da was? Wenn man das Datum über GetDate holt und es dann abspeichern wollen würde, bräuchte man ja 3 x ein Word also 6 Byte. Ich Probiere das mal aus.

Zitat:

Zitat von haentschman
Läßt sich der hex Wert nicht in Integer wandeln ? Und würde der entstehende Integer Wert dem Datum entsprechen ?

Ja klar kann man.
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?

Wolfgang Mix 28. Jan 2010 19:48

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
@bodycounter
Zitat:

Heiß das, das es keine Extra Datumsvariable unter TP gibt?
Ja, aber vielleicht gibt es die Unit DOS im Quelltext,
oder suche mal mit "FreePascal"

himitsu 28. Jan 2010 20:03

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
aus Unit Windows das MSDN-Library durchsuchenFileTimeToDosDateTime und dann gibt es noch irgendwo sowas wie FileTime-zu-DateTime

[add]
FileTime-zu-DateTime macht Delphi-Referenz durchsuchenFileAge über

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 Delphi-Referenz durchsuchenFileDateToDateTime gibt. :stupid:

bodycounter 29. Jan 2010 13:33

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 :)

fkerber 29. Jan 2010 13:36

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
Hi!

Wärst du auch so nett, uns es dann mitzuteilen?


Grüße, Frederic

himitsu 29. Jan 2010 13:40

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
Zitat:

Zitat von fkerber
Wärst du auch so nett, uns es dann mitzuteilen?

Schau dir einfach den Quellcode von FileDateToDateTime an,
falls es zufällig die selbe Kodierung ist. :angel2:

bodycounter 29. Jan 2010 14:02

Re: Wie kann man ein DOS Datum in Tdate umwandeln ???
 
Hier meine schnelle eigene Lösung:

Delphi-Quellcode:
function bytes2datetime(const date,time:integer):Tdatetime;
begin
    result := -109571 + date + (time/86400); // -109571 = 1.1.1600 | 86400 = Sekunden pro Tages
end;
Danke für die Tipps :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz