![]() |
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.
|
AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
Für D2009 habe ich einen mini-Hotfix
Delphi-Quellcode:
Es ist allerdings anzumerken, _UnixToDateTime() hat noch einen Fehler!!
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; 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. |
AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück
Zitat:
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; |
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; |
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.
|
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 :-) |
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 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz