Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 20.06.12 13:54 
Hi all

Welche Möglichkeit gibt es, ein TUnixTimeVal "verlustfrei" in ein TDateTime zu konvertieren?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  TunixTimeVal = record
    tv_Sec,            // Secs since 1/1/1970
    tv_uSec: LongWord; // microseconds
  end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.06.12 14:05 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TUnixTimeVal = record
    tv_Sec,            // Secs since 1/1/1970
    tv_uSec: LongWord; // microseconds
    function AsDateTime: TDateTime;
  end;
//...

function TUnixTimeVal.AsDateTime: TDateTime;
begin
  Result := UnixDateDelta + tv_Sec / SecsPerDay + (tv_uSec / MSecsPerSec) / 1000;
end;
So schätze ich mal.
sky21 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 20.06.12 14:17 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Danke für den Code!

ahhhh, vergleiche ich die Ausgabe mit deiner Funktion und meinem vorhandenen Code*, dann stimmen diese überein. Demnach muss es Probleme mit der Rückführung geben...Hast du mir dazu auch ein Snippet?

"meine Version"
ausblenden Delphi-Quelltext
1:
2:
// unix to date time
JclDateTime.UnixTimeToDateTime(ut.tv_Sec) + (ut.tv_uSec / 1000 / MSecsPerDay)


Meine Rückkehrfunktion geht so nicht...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 

ut2.tv_Sec  := JclDateTime.DateTimeToUnixTime( dt );
ut2.tv_uSec := MilliSecondOf( dt) * 1000;


Der Code snippet stimmt Arg, demnach stimmt mein Vorhandener Quellcode und es funktinoiert offenbar die Rück-Copnver
sky21 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Do 21.06.12 07:19 
hi all

Also da kann doch etwas nicht stimmen. Konvertiere ich ein Unix-Time-Val nach TDateTime, zurück und dann wieder nach TDateTime. Dann habe ich bei der Ausgabe EINE Sekunde mehr. das darf doch nicht sein oder? (Siehe code dazu unten)

Zu meiner eigentlichen Problemstellung: Ich muss basierend auf einem Unix-Time-Val eine Anzahl Millisekunden addieren. Die Weiterverarbeitung erfolgt danach 1x mit dem neuen Unix-Time-Val und 1x mit der nach TDateTime konvertierten Wert.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.Button1Click(Sender: TObject);
var
  str : string;
  ut1,ut2 : TUnixTimeVal;
  dt : TDateTime;

begin

  // given time stamp (=15:26:18.569127000)
  ut1.tv_Sec := $4fe1cf7a;
  ut1.tv_uSec:= $0008af27;


  dt := JclDateTime.UnixTimeToDateTime(ut1.tv_Sec) + ut1.tv_uSec / 1000 / MSecsPerDay;
  DateTimeToString(str, 'yyyy/mm/dd - hh:nn:ss.zzz', dt);
  memo1.lines.Add(str); // --> Ausgabe: 2012/06/20 - 13:26:18.569


  ut2.tv_Sec  := DateTimeToUnixTime( dt );
  ut2.tv_uSec := (MilliSecondOf( dt )) * 1000;  // * 1000 as it must be in microseconds


  dt := JclDateTime.UnixTimeToDateTime(ut2.tv_Sec) + ut2.tv_uSec / 1000 / MSecsPerDay;
  SysUtils.DateTimeToString(str, 'yyyy/mm/dd - hh:nn:ss.zzz', dt);
  memo1.lines.Add(str); // -> Ausgabe: 2012/06/20 - 13:26:19.569
end;


Hat irgend jemand eine Erklärung dazu? Danke!

Moderiert von user profile iconNarses: Beiträge zusammengefasst

thema hat sich erledigt; DateTimeToUnixTime( dt ); berücksticht auch den uSec anteil - was eben nicht gut ist...