AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Funktion "DateTimeToTimeStamp" in Delphicode übersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

Ein Thema von princyto · begonnen am 16. Nov 2011 · letzter Beitrag vom 17. Nov 2011
Antwort Antwort
princyto

Registriert seit: 13. Apr 2004
Ort: Ratingen
15 Beiträge
 
Delphi 2006 Enterprise
 
#1

Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 16. Nov 2011, 18:10
Delphi-Version: 5
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;
Eugen

Geändert von princyto (16. Nov 2011 um 18:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 16. Nov 2011, 18:45
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
princyto

Registriert seit: 13. Apr 2004
Ort: Ratingen
15 Beiträge
 
Delphi 2006 Enterprise
 
#3

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 09:18
Hallo Stevie,

es funktioniert hervorragend!

Vielen lieben Dank, dass ist genau das, was ich gesucht habe.
Eugen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 14:12
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 LDateTimeInMSecs := Trunc(DateTime * MSecsPerDay); statt LDateTimeInMSecs := Round(DateTime * MSecsPerDay); verwendet.
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 Result.Time := Trunc(Abs(Frac(DateTime)) * MSecsPerDay)); , aber da es in jenem negativen Bereich eh falsch rechnet, ist dieses nun auch sowas von egal.
$2B or not $2B

Geändert von himitsu (17. Nov 2011 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 17:50
Wie war das nochmal? Wenn die Funktion nicht richtig rechnet, ist egal, wie schnell sie dabei ist?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 17:59
Aktuell, also seit dem Jahre 1900, rechnet die ja richtig.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#7

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 17:59
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824

Geändert von Wolfgang Mix (17. Nov 2011 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 18:26
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#9

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 18:36
Qed
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Funktion "DateTimeToTimeStamp" in Delphicode übersetzen

  Alt 17. Nov 2011, 21:11
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...

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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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