Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktion "DateTimeToTimeStamp" in Delphicode übersetzen (https://www.delphipraxis.net/164518-funktion-datetimetotimestamp-delphicode-uebersetzen.html)

princyto 16. Nov 2011 17:10

Delphi-Version: 5

Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Hallo Delphi-Freunde,

ich habe mal eine Frage zu der Funktion "DateTimeToTimeStamp" der Unit SysUtils.
Ist Jemand in der Lage diesen Assemblercode in Delphicode zu übersetzen.

Vielen Dank für eure Bemühungen!

Delphi-Quellcode:
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
asm
        PUSH   EBX
{$IFDEF PIC}
        PUSH   EAX
        CALL   GetGOT
        MOV    EBX,EAX
        POP    EAX
{$ELSE}
        XOR    EBX,EBX
{$ENDIF}
        MOV    ECX,EAX
        FLD    DateTime
        FMUL   [EBX].FMSecsPerDay
        SUB    ESP,8
        FISTP  QWORD PTR [ESP]
        FWAIT
        POP    EAX
        POP    EDX
        OR     EDX,EDX
        JNS    @@1
        NEG    EDX
        NEG    EAX
        SBB    EDX,0
        DIV    [EBX].IMSecsPerDay
        NEG    EAX
        JMP    @@2
@@1:   DIV    [EBX].IMSecsPerDay
@@2:   ADD    EAX,DateDelta
        MOV    [ECX].TTimeStamp.Time,EDX
        MOV    [ECX].TTimeStamp.Date,EAX
        POP    EBX
end;

Stevie 16. Nov 2011 17:45

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Vermutlich keine 1:1 Übersetzung des asm Codes, aber was die Funktion macht:

Delphi-Quellcode:
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
var
  LDateTimeInMSecs: Int64;
  LDateInMSecs: Int64;
  LTimeInMSecs: Int64;
begin
  LDateTimeInMSecs := Round(DateTime * MSecsPerDay);
  LDateInMSecs := LDateTimeInMSecs div MSecsPerDay;
  LTimeInMSecs := Abs(LDateTimeInMSecs) mod MSecsPerDay;
  Result.Date := DateDelta + LDateInMSecs;
  Result.Time := LTimeInMSecs;
end;

princyto 17. Nov 2011 08:18

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Hallo Stevie,

es funktioniert hervorragend!

Vielen lieben Dank, dass ist genau das, was ich gesucht habe.

himitsu 17. Nov 2011 13:12

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Ich hätte jetzt zwar noch auf die zwei zusätzlichen Variablen verzichtet, was allerdings an der Funktion nix ändert.
Delphi-Quellcode:
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
var
  LDateTimeInMSecs: Int64;
begin
  LDateTimeInMSecs := Round(DateTime * MSecsPerDay);
  Result.Date := (LDateTimeInMSecs div MSecsPerDay) + DateDelta;
  Result.Time := Abs(LDateTimeInMSecs) mod MSecsPerDay;
end;
Und wenn man jetzt mal ganz billig
Delphi-Quellcode:
LDateTimeInMSecs := Trunc(DateTime * MSecsPerDay);
statt
Delphi-Quellcode:
LDateTimeInMSecs := Round(DateTime * MSecsPerDay);
verwendet. :stupid:
Delphi-Quellcode:
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
begin
  Result.Date := Trunc(DateTime) + DateDelta;
  Result.Time := Trunc(Frac(DateTime) * MSecsPerDay));
end;
Achtung: Vor dem 30.12.1899 würde diese Variante nicht korrekt rechnen.
Eigentlich ja
Delphi-Quellcode:
Result.Time := Trunc(Abs(Frac(DateTime)) * MSecsPerDay));
, aber da es in jenem negativen Bereich eh falsch rechnet, ist dieses nun auch sowas von egal. :oops:

Stevie 17. Nov 2011 16:50

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Wie war das nochmal? Wenn die Funktion nicht richtig rechnet, ist egal, wie schnell sie dabei ist? :stupid:

himitsu 17. Nov 2011 16:59

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Aktuell, also seit dem Jahre 1900, rechnet die ja richtig. :angle2:

Wolfgang Mix 17. Nov 2011 16:59

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Nach meinen bisherigen Erfahrungen rechnet die Funktion rückwärts bis zum 1.1.0001 korrekt, oder wo ist mein Denkfehler?
zeige mal bitte ein Beispiel.

Alternativ helfen folgende Funktionen von mir:

http://www.delphipraxis.net/142643-p...it-delphi.html@himi

Stevie 17. Nov 2011 17:26

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Zitat:

Zitat von Wolfgang Mix (Beitrag 1136740)
Nach meinen bisherigen Erfahrungen rechnet die Funktion rückwärts bis zum 1.1.0001 korrekt, oder wo ist mein Denkfehler?
zeige mal bitte ein Beispiel.

Alternativ helfen folgende Funktionen von mir:

http://www.delphipraxis.net/142643-p...it-delphi.html@himi

Himims 2. Version rechnet nicht richtig - schrieb er ja dazu.

Wolfgang Mix 17. Nov 2011 17:36

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Qed:)

Stevie 17. Nov 2011 20:11

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
 
Immer diese Diskussionen um schon längst gelöste Fragen nur um Variablen zu sparen, die das ganze eigentlich für den Fragesteller nur lesbarer und nachvollziehbarer machen sollten... :roll:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function HimisDateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
begin
  Result.Date := Trunc(DateTime) + DateDelta;
  Result.Time := Trunc(Frac(DateTime) * MSecsPerDay);
end;

var
  d: TDateTime;
  t: TTimeStamp;
begin
  d := EncodeDate(1899, 11, 11) +  EncodeTime(11, 11, 11, 00);

  t := DateTimeToTimeStamp(d);
  Writeln(t.Date, ' ', t.Time);

  t := HimisDateTimeToTimeStamp(d);
  Writeln(t.Date, ' ' , t.Time);
  Readln;
end.
qef


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 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