Moinmoin,
im Rahmen eines Projektes brauch ich die Umrechnung von TDatetime-Werten nach UnixTimeStamp und zurück. Das ganze aber manuell ohne Dateutils. Da die Funktionen aus der Codelib
Hier, nicht so wirklich funktionieren (erstens wird von der Deutschen Zeitzone ausgegangen, 2 wird der Zeitteil nicht wirklich korrekt berechnet), hab ich mich dazu entschlossen, das ganze selbst um zusetzen.
Die Umrechnung eines TDatetime-Wertes zu einem Unixtimestamp funktioniert auch schon:
Delphi-Quellcode:
const
cSecPerDay = 86400;
cMSecPerDay = 86400000;
cDelphiEpoche = -2209161600; //30.12.1899 als UTS
function DateTimeToUnixtimestamp(const value:TDateTime):Int64;
var
TimePart : extended;
Zeit : int64;
datum: int64;
begin
zeit := Trunc(Abs(Frac(value))*cSecPerDay); //Zeitanteil in Sekunden
timepart := frac(Abs(Frac(value))*cMSecPerDay); //Millisekunden
datum := trunc(int(value)*cSecPerDay); //Anzahl der Tage mit Bezug Delphi-Epoche in Sekunden
result := cDelphiEpoche+(datum+zeit);
if (timepart > 0.5) then //Korrektur bei 500+ Millisekunden
inc(result);
end;
Leider will die Umkehrfunktion (also von Unixtimestamp nach TDatetime) nicht so wirklich funktionieren.
Delphi-Quellcode:
function UnixTimeStampToDateTime(const value:int64):TDateTime;
var
datum : int64;
base,rest : int64;
zeit,timepart : Extended;
base := cDelphiEpoche - value;
datum := base DIV cSecPerDay;
rest := base MOD cSecPerDay;
timepart := cMSecPerDay/ABS(rest);
zeit := cSecPerDay/Abs(rest);
if (Frac(abs(Timepart))>0.5) then
zeit := cSecPerDay/(base - (datum*cSecPerday))+1;
result := datum+zeit;
end;
Ein Unterschied von 1 sek (+/-) wär ok, da ein Unixtimestamp keine Millisekunden berücksichtigt. Leider bekomme ich aber Unterschieder von teilweise mehreren Tagen.
Kann mir da jemand auf die Sprünge helfen ?
Anmerkung: Das ganze sollte sowohl mit positiven als auch negativen Werten klarkommen.