Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unix-Time in TDateTime convertieren (https://www.delphipraxis.net/882-unix-time-tdatetime-convertieren.html)

theomega 19. Sep 2002 16:07


Unix-Time in TDateTime convertieren
 
Hallo

ich habe aus einem Forum einen Wert in UnixTime. Diese will ich jetzt in einen TDateTime wert umwandeln. Dabei geht es mir nichtnur um das Datum, sonders auch um die Uhrzeit. Weiß jemand wie das geht?

Danke

TO

sakura 19. Sep 2002 16:09

Wie ist den der Wert unter UNIX aufgebaut. Dann müsste man den doch recht leicht ermitteln können. Mit welchem Wert korrespondiert 0 unter UNIX, ich glaube 1.1.1970.

theomega 19. Sep 2002 16:19

Mal ein Paar Beispiele:

17.09.2002, 13:41 Uhr => 1032262863
17.09.2002, 17:55 Uhr => 1032278130
29.08.2002, 12:05 Uhr => 1030615518
17.09.2002, 17:46 Uhr => 1032277564

Reciht das, oder brauchst du noch mehr?

Order hilft diese Funktion: leider PHP
Code:
function form_date($time, $verbose = 1)
{
      return date("d.m.Y, H:i", $time) . " Uhr";
}
oder auch eine Dlephi-Funktion hätte ich anzubieten, leider funzt die nur auf den Tag genau:
Code:
Function UnixIntToPcInt(Time:UnixTime):TDateTime;
Begin
  Result := Time / 86400 + 25569;
End;

Christian Seehase 19. Sep 2002 16:59

Moin The Omega,

schau Dir doch mal die API Int32x32To64 an, sowie das Beispiel (Converting a time_t Value to a File Time) auf das dort verwiesen wird.

theomega 19. Sep 2002 17:12

Werde aus der Sache garnicht schlau: in welcher Unit (DLL) ist die Funktion deklariert? Und was tut die überhaupt?

Chewie 19. Sep 2002 17:34

Ich nehm an, du meinst die UNIX-Zeit, die seit dem 1.1.1970 die Sekunden zählt. Die, die man mit der PHP-Funktion time() ermittelt.
Die gleiche Funktion brauchte ich auch einmal und hab sie mir selber geschrieben. Leider hat sie einen fehler von etwa 0,1 s. Also in etwa 10% aller Fälle liegt sie eine Sekunde falsch. Aber ich such die Funktion gleich mal raus und schreib noch was dazu.



So, hier ist sie:

Code:
function DateTimetoUNIX(zeit: TDateTime): Longint;
const UnixDateDelta=25569;
begin
  Result:=Round(((zeit-UnixDateDelta)*24*60*60)-7200.5);
end;
Wenn man Delphi6 > hat, braucht man die Konstantendeklaration nicht. Die Funktion rechnet anhand der Konstante die Tage, dann die Stunden, dann die Minuten und schließlich die Sekunden aus, die seit dem 1.1.1970 vergangen sind. Die Subtraktion von 7200.5 am Ende kommt daher, dass der Code am Anfang einen falschen Wert lieferte und ich dann gesehen hab, dass es etwa 7200 s waren. Das hat dann auch nicht so ganz gestimmt. Dann hab ich gleichzeitig PHP-Scripts und die Funktion im Delphi-Programm ausgeführt und die Werte verglichen, solange, bis ich was gescheites gefunden hab. Ich hab dann die ,5 genommen, das stimmt im Großen und Ganzen überein. Aber da mir keine einfache Möglichkeit einfiel, PHP und Delphi gleichzeitig zu testen, ist dieses Ergebnis nicht 100%ig genau (wie oben beschrieben). Vielleicht weiß jemand, warum ich noch die 7200 Sekunden und ein paar Zerquetschte abzeiehen muss, um zum richtigen Ergebnis zu kommen?

theomega 19. Sep 2002 18:49

Chewie: ich suchte aber leider eine Funktion in die andere Richtug:
UnixTime -> TDateTime.

theomega 19. Sep 2002 18:53

habe gerade folgendes versucht: funzt leider nicht
Code:
function UnixtoDateTime(zeit:longint):TDateTime;
const UnixDateDelta=25569;
var t:TDatetime;
begin;
t:=((zeit+UnixDateDelta)/24/60/60)+7200.5;
result := t;
end;
ich habe einfach versucht die Funktion umzudrehen.

theomega 19. Sep 2002 18:57

Habe es hibekommen: diese funktion funzt:
Code:
function UnixtoDateTime(UnixTime: Double; UTC: Boolean): TDateTime;
var
  SysTime, TmpSysTime: TSystemTime;
  DTime: TDateTime;
  FTime, LTime: TFileTime;
begin
  DTime := (UnixTime / (24 * 3600)) + EncodeDate(1970, 1, 1);

  if UTC = true then
    result := DTime
  else
  begin
    DateTimeToSystemTime(DTime, TmpSysTime);

    SystemTimeToFileTime(TmpSysTime, FTime);
    FileTimeToLocalFileTime(FTime, LTime);
    FileTimeToSystemTime(LTime, SysTime);

    result := SystemTimeToDateTime(sysTime);
  end;
end;
könnte mir nur einer Sagen, was der zweite Parameter soll?

Chewie 19. Sep 2002 20:29

Zitat:

Zitat von theomega
Chewie: ich suchte aber leider eine Funktion in die andere Richtug:
UnixTime -> TDateTime.

Ups, da hat wohl jemand nicht genau gelesen :mrgreen: :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 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