Прошу помочь с задачкой. Мне нужно сформировать функцию разложения числа UnixTime на составляющие (день, месяц, год, час, минута, секунда). В сети есть набор алгоритмов для такого разложения, однако когда я пытаюсь свериться со стандартными функциями модуля DateUtils, получается какая-то хрень. Вот мой код функции (оптимизировать я буду только после того, как все заработает):
- Код: Выделить всё
function unixTimeToSLDateTime (ut: Int64): TSLDateTime;
var dt, dttmp: TSLDateTime;
DaysBet, SecBetMod, secs: Int64;
I, LeapYears, CurYrDays, dim, dimsum, tmp: Word;
begin
dt.year:=1970+(ut div SECONDSINYEAR);
secs:=0;
for I:=1970 to dt.year-1
do if isLeapYear (I) then secs:=secs+SECONDSINLEAPYEAR
else secs:=secs+SECONDSINYEAR;
CurYrDays := (ut - secs) div SECONDSINDAY;
dimsum:=0;
for I:=0 to 11
do begin
if I<>1
then dim:=DAYSINMONTHARRAY [I]
else if IsLeapYear (dt.year)
then dim:=29 else dim:=28;
dimsum:=dimsum+dim;
if dimsum > CurYrDays
then begin
Dec (dimsum, dim);
dt.month:=I+1;
dt.day:=CurYrDays-dimsum+1;
Break;
end;
secs:=secs+(dim*SECONDSINDAY);
end;
secs:=ut-secs;
dt.hour:=secs div SECONDSINHOUR;
secs:=secs-(dt.hour*SECONDSINHOUR);
dt.minute:=secs div 60;
dt.second := secs mod 60;
Result:=dt;
end;
Вот фрагменты тестирующего кода:
- Код: Выделить всё
type
TSLDateTime = record
second, minute, hour, weekday,
day, month: byte;
year: word;
end;
...
function SLDateTimeToString (dt: TSLDateTime): String;
var s: String;
begin
s:=IntToStr (dt.day);
if dt.day<10 then s:='0'+s;
Result:=s+'.';
s:=IntToStr (dt.month);
if dt.month<10 then s:='0'+s;
Result:=Result+s+'.';
s:=IntToStr (dt.year);
Result:=Result+s+' ';
s:=IntToStr (dt.hour);
if dt.hour<10 then s:='0'+s;
Result:=Result+s+':';
s:=IntToStr (dt.minute);
if dt.minute<10 then s:='0'+s;
Result:=Result+s+':';
s:=IntToStr (dt.second);
if dt.second<10 then s:='0'+s;
Result:=Result+s;
end;
...
var
dt: TDateTime;
U: Int64;
s: String;
sldt: TSLDateTime;
...
Memo1.Lines.Add ('UnixTimeToSLDateTime');
dt:=EncodeDate (2008, 2, 15)+EncodeTime (11, 31, 33, 0);
for I:=1 to 7
do begin
U:=DateTimeToUnix (dt);
sldt:=unixTimeToSLDateTime (U);
s:=IntToStr (U)+#9
+DateToStr (dt)+' '+TimeToStr(dt)+#9+SLDateTimeToString (sldt);
Memo1.Lines.Add (s);
dt:=dt+10*1/4;
end;
Добавлено спустя 2 минуты 26 секунд:
А вот вывод в мемо:
UnixTimeToSLDateTime
1203075093 15-2-08 11:31:33 15.02.2008 91:31:33
1203291093 17-2-08 23:31:33 17.02.2008 151:31:33
1203507093 20-2-08 11:31:33 20.02.2008 211:31:33
1203723093 22-2-08 23:31:33 22.02.2008 15:31:33
1203939093 25-2-08 11:31:33 25.02.2008 75:31:33
1204155093 27-2-08 23:31:33 27.02.2008 135:31:33
1204371093 1-3-08 11:31:33 01.03.2008 11:31:33
Чую, проблема простейшая, но не могу понять, где. Уже третий день мозг выносит. Заранее благодарен.