Jetzt wo du es sagst, mal schnell nachgesehn, ob meine beschriebene Berechnung stimmt.
Delphi-Quellcode:
function TimeStampToDateTime(
const TimeStamp: TTimeStamp): TDateTime;
asm
{$IFDEF ALIGN_STACK}
SUB ESP, 4
{$ENDIF ALIGN_STACK}
PUSH EBX
{$IFDEF PIC}
PUSH EAX
CALL GetGOT
MOV EBX,EAX
POP EAX
{$ELSE !PIC}
XOR EBX,EBX
{$ENDIF !PIC}
PUSH EAX
CALL ValidateTimeStamp
POP EAX
MOV ECX,[EAX].TTimeStamp.Time
MOV EAX,[EAX].TTimeStamp.Date
SUB EAX,DateDelta
IMUL [EBX].IMSecsPerDay
OR EDX,EDX
JNS @@1
SUB EAX,ECX
SBB EDX,0
JMP @@2
@@1: ADD EAX,ECX
ADC EDX,0
@@2: PUSH EDX
PUSH EAX
FILD QWORD PTR [ESP]
FDIV [EBX].FMSecsPerDay
ADD ESP,8
POP EBX
{$IFDEF ALIGN_STACK}
ADD ESP, 4
{$ENDIF ALIGN_STACK}
end;
Aua, wozu muß das unbedingt in Assembler sein (XE),
wenn auch sowas reicht?
Delphi-Quellcode:
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
begin
ValidateTimeStamp(TimeStamp);
Result := TimeStamp.Time / MSecsPerDay + TimeStamp.Data - DateDelta;
end;
// Mein Vorschlag sagte zwar
// Result := TimeStamp.Data - DateDelta + TimeStamp.Time / MSecsPerDay;
// aber ohne Zwischenvariable für die Division isses bestimmt besser.
Integer.Parse: StrToInt in alten Delphis.