Добреее.... Да видим сега как стоят нещата...
Значи по въпросчетата - нямах точно това предвид. Идеята ми беше, че когато имаме разлика от време нямаме ясно дефинирани месеци и години. Веднага давам пример - имаме разлика от 365 дни. Прилича разликата да е 1 година, нали ? Да, ,при условие, че датите ни са 1.1.2002 и 1.1.2003 например. Ама ако първата дата е 1.1.2000, то втората дата обаче ще дойде 31.12.2000... По същия начин стоят нещата и с месеците - разлика от 30 дни може да е 1 месец, или 1 месец и 1 или 2 дена, или просто 30 дни
Мдаааа. А сега едно възможно решение:
(само да кажа, че при минус не знам си колко градуса навън и едноседмична почивка за климатика умирам от студ и не мога много-много да мисля, така че може и да съм объркал нещо )
Дефинираме си типче, за да си улесним живота.
type TDateArray = Array[0..6] of Word;
const bases: TDateArray = (65535, 12, 30, 24, 60, 60, 1000);
И няколко помощни функцийки:
function GetBase(da: TDateArray; idx: Integer): Word;
var y, m, d: Word;
begin
if idx = 2 then
begin
if da[1] = 12 then
begin
m := 1;
y := da[0] + 1;
end
else
begin
m := da[1];
y := da[0];
end;
DecodeDate(EncodeDate(y, m, 1) - 1, y, m, d);
Result := d;
end
else
Result := bases[idx];
end;
procedure DateDec(var da: TDateArray; idx: Integer; val: Word);
begin
if da[idx] < val then
begin
da[idx] := da[idx] + GetBase(da, idx) - val;
DateDec(da, idx - 1, 1);
end
else
Dec(da[idx], val);
end;
А самият код е следния:
var
a1, a2: TDateArray;
dt1, dt2: TDateTime;
//dt2 > dt1
DecodeDate(dt1, a1[0], a1[1], a1[2]);
DecodeTime(dt1, a1[3], a1[4], a1[5], a1[6]);
DecodeDate(dt2, a2[0], a2[1], a2[2]);
DecodeTime(dt2, a2[3], a2[4], a2[5], a2[6]);
for i := 6 downto 0 do
DateDec(a2, i, a1);
ShowMessage(Format('%4.4d.%2.2d.%2.2d %2.2d:%2.2d:%2.2d:%3.3d', [a2[0], a2[1], a2[2], a2[3], a2[4], a2[5], a2[6]]));
Не е най-обстойно тестваното от мен нещо, но тъй като просто умирам от студ, а то има вид да работи горе-долу - поствам си го и оставям на народа да си каже мнението, пък аз довечера като се прибера на топло и полежа малко върху печката, че да ми се размрази оная работа (акъла имам предвид ) ще му хвърля още едно оченце ![](http://i.dirbg.com/clubs/icons/wink.gif)
Човешкият ум е ограничен. Глупостта не е.
|