Функции перевода UNIX и Java даты в TDateTime

Все как и указано в заголовке + функция вычисляющая разницу между указанной датой и системным временем (может пригодится при разработке IM-клиентов)

unit unit4;

interface

uses
Windows, SysUtils;

function DateTimeToUnix(ConvDate: TDateTime): Longint;
function UnixToDateTime(USec: Longint): TDateTime;
function JavaToDateTime(USec: int64): TDateTime;
function DateTimeToJava(ConvDate: TDateTime): int64;
function GetElapsedTime(last:int64):string;

implementation

const

// Sets UnixStartDate to TDateTime of 01/01/1970
UnixStartDate: TDateTime = 25569.0;

function DateTimeToUnix(ConvDate: TDateTime): Longint;
begin
//example: DateTimeToUnix(now);
Result := Round((ConvDate - UnixStartDate) * 86400);
end;

function UnixToDateTime(USec: Longint): TDateTime;
begin
//Example: UnixToDateTime(1003187418);
Result := (Usec / 86400) + UnixStartDate;
end;

function DateTimeToJava(ConvDate: TDateTime): int64;
var
TimeZoneInformation: TTimeZoneInformation;
JavaUTC:int64;
begin
GetTimeZoneInformation(TimeZoneInformation);
JavaUTC:=((TimeZoneInformation.Bias+TimeZoneInformation.DaylightBias)*60*1000);
Result := Round(((ConvDate - UnixStartDate) * 86400*1000) + JavaUTC);
end;

function JavaToDateTime(USec: int64): TDateTime;
var
TimeZoneInformation: TTimeZoneInformation;
begin
GetTimeZoneInformation(TimeZoneInformation);
Usec:=Usec-((TimeZoneInformation.Bias+TimeZoneInformation.DaylightBias)*60*1000);
Result := (Usec / (86400*1000)) + UnixStartDate;
end;

function GetElapsedTime(last:int64):string;
var
delta:int64;

SECOND:longint;
MINUTE:longint;
HOUR:longint;
DAY:longint;

begin
//initialization
SECOND := 1000;
MINUTE := 60 * SECOND;
HOUR := 60 * MINUTE;
DAY := 24 * HOUR;
//

delta:=DateTimeToJava(now)-last;
if delta < MINUTE then result:='Меньше минуты назад'
else if delta < HOUR then result:=IntToStr(delta div MINUTE)+' минут назад'
else if delta < DAY then result:=IntToStr(delta div HOUR)+' часов '+IntToStr((delta-(delta div HOUR)*HOUR) div MINUTE)+' минут назад'
else result:=IntToStr(delta div DAY)+' дней '+IntToStr((delta-(delta div DAY)*DAY) div HOUR)+' часов '+IntToStr((delta-((delta div HOUR)*HOUR)-((delta div DAY)*DAY) div HOUR) div MINUTE)+' минут назад';
end;

end.

0 comments: