Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Konvertierung UnixTimeStamp nacht TDateTime und zurück (https://www.delphipraxis.net/196625-konvertierung-unixtimestamp-nacht-tdatetime-und-zurueck.html)

KodeZwerg 6. Jun 2018 11:46

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
Deine Rückverwandlung konnte ich halbwegs Reparieren aber wenn ich Härtetest durchführe, je näher man dem Datum "31.12.1899 23:59:59" kommt umso ungenauer wird es mit dem "DelphiEpoche"-Stil, da spielen die Werte verrückt da Du den "30.12.1899" gewählt hast, die Zeit geht irgendwie auch immer verloren, da habe ich auch keine Lösung für gefunden.

KodeZwerg 6. Jun 2018 14:36

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
Für D2009 habe ich einen mini-Hotfix
Delphi-Quellcode:
function _DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  if AValue >= 0 then
    Result := Round((AValue - _UnixDateDelta) * _SecsPerDay)
  else
    Result := 172798 + Round((AValue - _UnixDateDelta) * _SecsPerDay);
end;

function _UnixToDateTime(const AValue: Int64): TDateTime;
begin
  if AValue >= 0 then
    Result := AValue / _SecsPerDay + _UnixDateDelta
  else
    Result := (AValue - 172798) / _SecsPerDay + _UnixDateDelta;
end;
Es ist allerdings anzumerken, _UnixToDateTime() hat noch einen Fehler!!
Die Sekunden-Angabe schwankt was zum Beispiel bei 23:59:59 auch den nächsten Tag zur Folge haben könnte !!
Oder anders herum kann auch aus ein 00:00:00 der vorige Tag werden !! Je nachdem wohin die MSecs schwanken +0.5 oder -0.5.
Ich hoffe es ist Verständlich was ich meine.

samso 7. Jun 2018 06:10

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
Zitat:

Zitat von Ghostwalker (Beitrag 1403994)
Samso's Variante funktioniert perfekt :)

Leider nicht. Bei der Uhrzeit 00:00:00 gab es Probleme, die ich so gelöst habe:

Delphi-Quellcode:
uses
  SysUtils, Math;

function UnixTimeToDatetime(UnixTime: Int64): TDatetime;
var
  d, t: Double;
begin
  d := UnixTime/SecsPerDay + UnixDateDelta;
  t := frac(d);
  if (d>=0) or IsZero(t)
  then
    Result := d
  else
    Result := trunc(d) - t - 2;
end;

Ghostwalker 7. Jun 2018 07:13

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
@Samso

Jup, aber nur bei Daten vor oder gleich dem 30.12.1899 .

Habs nochmal korregiert, lt. meinen Unit-Tests funktionierts so:

Delphi-Quellcode:
function UnixToDateTime(const value:int64):TDateTime
var
  d, t: Extended;
begin
  d := value/cSecPerDay + cUnixEpocheDT;
  t := frac(d);
  if (value <= cDelphiEpocheUT) then
  begin
    if (d>=0) or IsZero(t)
    then
      Result := d
    else
      Result := trunc(d) - t - 2;
  end
  else
    result := d;
end;

samso 7. Jun 2018 07:46

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
Die Fälle in denen das Datum >= 30.12.1899 ist, wird bereits durch die Abfrage "d>=0" behandelt und führt immer in den Zweig "Result := d". Deshalb ist die Abfrage value <= cDelphiEpocheUT redundant.

KodeZwerg 7. Jun 2018 08:23

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
Mein D2009 Hotfix ist auch nicht das gelbe vom Ei.
Meine Problem Daten sind diese hier 29-31.12.1899 00:00:00/23:59:59 und hört hier auf 31.12.1969 23:59:59.
Alles au0erhalb dieses Bereichs funktioniert mit der D2009 Methode auf Anhieb, alles was da zwischen liegt kann Probleme bereiten.

edit
Ich bastel noch ein wenig am D2009 rum, wenn ich mir aus den Werten einen TimeStamp erzeuge kann ich sehr einfach das lösen was D2009 noch falsch macht.
Für alles zwischen 01.01.1900 00:00:00 und 01.01.1970 00:00:00 muss man einen Tag und 2 Sekunden dazu addieren.
Probleme habe ich noch wenn man exakt 31.12.1899 bzw 31.12.1969 verwendet, aber das bekomme ich auch noch gefixt.
Am ToUnix muss ich auch nochmal ran, der Interpretiert auch noch nicht alles korrekt was dann logischerweise zu einem falschen Ergebnis führt, also alles mehr oder minder leicht zu korrigieren wenn man genug Zeit investiert um alle möglichen Datums angaben durchzutesten :-)

Ghostwalker 7. Jun 2018 11:50

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
 
@Samso

Jup..hast recht.

Damit funktionieren jetzt beide Varianten (Unix->TDateTime und TDateTime->Unix).


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 3 von 3     123   

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