Раскладка UnixTime на составляющие
 Добавлено: 20.01.2018 08:53:14
Добавлено: 20.01.2018 08:53:14Приветствую всех.
Прошу помочь с задачкой. Мне нужно сформировать функцию разложения числа UnixTime на составляющие (день, месяц, год, час, минута, секунда). В сети есть набор алгоритмов для такого разложения, однако когда я пытаюсь свериться со стандартными функциями модуля DateUtils, получается какая-то хрень. Вот мой код функции (оптимизировать я буду только после того, как все заработает):
Вот фрагменты тестирующего кода:
Добавлено спустя 2 минуты 26 секунд:
А вот вывод в мемо:
Чую, проблема простейшая, но не могу понять, где. Уже третий день мозг выносит. Заранее благодарен.
			Прошу помочь с задачкой. Мне нужно сформировать функцию разложения числа 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
Чую, проблема простейшая, но не могу понять, где. Уже третий день мозг выносит. Заранее благодарен.