Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Algorithmen (https://www.delphipraxis.net/28-library-algorithmen/)
-   -   Delphi UnixTime in ein Datum und in eine Zeit umwandeln (https://www.delphipraxis.net/6250-unixtime-ein-datum-und-eine-zeit-umwandeln.html)

Luckie 5. Jul 2003 06:13


UnixTime in ein Datum und in eine Zeit umwandeln
 
Diese beiden Funktionen wandeln einen UnixTimeStamp in ein Datums- bzw. in einen Zeit-String um ohne Verwendung der Unit SysUtils.

Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Procedure : UnixTimeToDateString - Author : Michael Puff
  Date     : 2003-07-05
  Purpose  : Converts a Unixtimestamp to local systemtime
-----------------------------------------------------------------------------}
function UnixTimeToDateString(i: PDWORD): string;
var
  umt: int64;
  st: TSystemTime;
  ft: TFileTime;
  li: ULARGE_INTEGER;
  buf: array[0..255] of char;
begin
  result := '';
  if i = nil then
    exit;
  umt := i^;
  st.wYear := 1970;
  st.wMonth := 1;
  st.wDayOfWeek := 0;
  st.wDay := 1;
  st.wHour := 0;
  st.wMinute := 0;
  st.wSecond := 0;
  st.wMilliseconds := 0;
  SystemTimeToFileTime(st, ft);
  li.QuadPart := (umt * 10000000) + ULARGE_INTEGER(ft).QuadPart;
  ft.dwLowDateTime := li.LowPart;
  ft.dwHighDateTime := li.HighPart;
  FileTimeToSystemTime(ft, st);
  ZeroMemory(@buf, sizeof(buf));
  if (GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, @st, nil, buf,
    sizeof(buf)) > 0) then
    Result := string(buf);
end;
Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Procedure : UnixTimeToTimeString - Author : Michael Puff
  Date     : 2003-07-05
  Purpose  : Converts a Unixtimestamp to local systemtime
-----------------------------------------------------------------------------}
function UnixTimeToTimeString(i: PDWORD): string;
var
  umt: int64;
  st: SystemTime;
  ft: FileTime;
  li: ULARGE_INTEGER;
  buf: array[0..255] of char;
begin
  result := '';
  if i = nil then
    exit;
  umt := i^;
  st.wYear := 1970;
  st.wMonth := 1;
  st.wDayOfWeek := 0;
  st.wDay := 1;
  st.wHour := 0;
  st.wMinute := 0;
  st.wSecond := 0;
  st.wMilliseconds := 0;
  SystemTimeToFileTime(st, ft);
  li.QuadPart := (umt * 10000000);
  ft.dwLowDateTime := li.LowPart;
  ft.dwHighDateTime := li.HighPart;
  FileTimeToSystemTime(ft, st);
  ZeroMemory(@buf, sizeof(buf));
  if (GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, buf,
    sizeof(buf)) > 0) then
    Result := string(buf);
end;

Gast 5. Jul 2003 15:37

Warum so kompliziert (i.e. warum vorher extra ausrechnen wann der XX.YY.1970 war)?

Eugen und meinereiner haben irgendwann malunabhängig voneinander ca folgendes geschrieben. Wo ich das jetzt zu stehen habe, weiß ich aber net mehr :) ... Zumindest siehste ja die fette Konstante. Umgekehrt wäre analog zu berechnen.
Ich werde nochmal schauen, ob ich da noch ne Version hinbekomme, die mit einer gestrippten Systemunit funzt (i.e. keine Int64 Unterstützung ;))

Delphi-Quellcode:
function UnixTimeToFileTime(t: LongWord): FILETIME;
var ll: int64;
begin
  ll := (Int64(t) * 10000000) + int64(116444736000000000);
  result.dwLowDateTime := LongWord(ll);
  result.dwHighDateTime := ll shr 32;
end;
Nachtrag: Daß meine Func nicht einen String ausgibt ist mir klar ... aber das ist dann auch wirklich nicht mehr so schwer :)


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