AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Konvertierung UnixTimeStamp nacht TDateTime und zurück

Konvertierung UnixTimeStamp nacht TDateTime und zurück

Ein Thema von Ghostwalker · begonnen am 5. Jun 2018 · letzter Beitrag vom 7. Jun 2018
Antwort Antwort
Seite 3 von 3     123
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 6. Jun 2018, 11:46
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 6. Jun 2018, 14:36
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#23

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 7. Jun 2018, 06:10
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;
  Mit Zitat antworten Zitat
Ghostwalker

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

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 7. Jun 2018, 07:13
@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;
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#25

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 7. Jun 2018, 07:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 7. Jun 2018, 08:23
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
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 7. Jun 2018 um 08:59 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

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

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 7. Jun 2018, 11:50
@Samso

Jup..hast recht.

Damit funktionieren jetzt beide Varianten (Unix->TDateTime und TDateTime->Unix).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
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