Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
7. Jun 2018
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...
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
6. Jun 2018
Für D2009 habe ich einen mini-Hotfix
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;
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
6. Jun 2018
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.
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
gelöscht - meine Korrektur für Deine Rückverwandlung war mehr als falsch. Sorry, ich versuchs nochmal.
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Wie man hier sehen kann, funktionieren 3 Methoden.
Tokyo per Units, D2009 per Code, Samso per Code.
Die GW Methode aus Post #1 bei Rückverwandlung klappt etwas nicht.
Der Fehler mit D2009 Rückverwandlung entstand weil UnixTimeA verwendet wurde und nicht sein zugewiesener UnixTimeB.
Nun A B C D vorhanden :-)
program UT2;
{$APPTYPE CONSOLE}
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Mit der alten Version da habe ich Schuld, ich sah nur vom Ghostwalger den Source, startete mein D2009 und teilte den Inhalt. Tut mir leid Khostwalker und alle anderen!!
Ich habe es selber noch nicht getestet aber ich vermute für vor 1899 muss man das andere Delta nehmen (wenn Input negativ ist?).
edit
Ps: Die Konstanten stammen bei mir aus SysUtils.pas nicht aus DateUtils.pas.
edit #2...
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Was ich oben schrieb war/ist Original Code von DateUtils.pas aus Delphi 2009.
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Wenn man sich die SysUtils.pas anschaut, vielleicht ist das von Bedeutung für Dein Problem.
{ Days between 1/1/0001 and 12/31/1899 }
DateDelta = 693594;
{ Days between TDateTime basis (12/31/1899) and Unix time_t basis (1/1/1970) }
UnixDateDelta = 25569;
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Wieviel mehr kann man denn unabhängig sein? Nja egal, bin raus.
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by KodeZwerg,
5. Jun 2018
Warum nicht die Funktionen aus DateUtils.pas verwenden?
uses nichts;
const
UnixDateDelta = 25569;
SecsPerDay = 86400;