Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 04:58
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat