Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - UnixTimeToDateTime?
sky21 - Mi 20.06.12 12:54
Titel: UnixTimeToDateTime?
Hi all
Welche Möglichkeit gibt es, ein TUnixTimeVal "verlustfrei" in ein TDateTime zu konvertieren?
Delphi-Quelltext
1: 2: 3: 4:
| TunixTimeVal = record tv_Sec, tv_uSec: LongWord; end; |
jaenicke - Mi 20.06.12 13:05
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TUnixTimeVal = record tv_Sec, tv_uSec: LongWord; 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 - Mi 20.06.12 13:17
Moderiert von
Narses: 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"
Delphi-Quelltext
1: 2:
| JclDateTime.UnixTimeToDateTime(ut.tv_Sec) + (ut.tv_uSec / 1000 / MSecsPerDay) |
Meine Rückkehrfunktion geht so nicht...
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 - Do 21.06.12 06: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.
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
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);
ut2.tv_Sec := DateTimeToUnixTime( dt ); ut2.tv_uSec := (MilliSecondOf( dt )) * 1000;
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); end; |
Hat irgend jemand eine Erklärung dazu? Danke!
Moderiert von
Narses: Beiträge zusammengefasstthema hat sich erledigt; DateTimeToUnixTime( dt ); berücksticht auch den uSec anteil - was eben nicht gut ist...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!