![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вычисление даты [D7, XP]
did_elena © (2006-09-22 16:06:00)может, кто-нибудь поможет в таком вопросе:
нужно посчитать разницу между двумя полями в формате даты в StringGridе и записать результат в поле другого StringGridа в таком, например, виде: 5 лет 3 мес. 20 дн.
Aleks (2006-09-28 09:22:00) [1]unit:
DateUtil --- Äîáàâèòü â uses
DaysBetween - Âû÷èñëÿåò ÷èñëî äíåé ìåæäó äàòàìè Date1 è Date2,
MonthsBetween - Ôóíêöèÿ âû÷èñëÿåò ÷èñëî ìåñÿöåâ ìåæäó äâóìÿ äàòàìè.
С годами я думаю проблем не будет :)
на всякий случай
DecodeDate ðàçáèâàåò äàòó Date íà ãîä - Year, ìåñÿö - Month è äåíü - Day
Пример:
DecodeDate(Date,Year,Month,Day);
RASkov (2006-09-27 20:36:00) [2]Вот верезка из DateUtil из RxLib, вроде ничего незабыл...
function IsLeapYear(AYear: Integer): Boolean;
begin
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
end;
function DaysPerMonth(AYear, AMonth: Integer): Integer;
const
DaysInMonth: array[1..12] of Integer =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
Result := DaysInMonth[AMonth];
if (AMonth = 2) and IsLeapYear(AYear) then Inc(Result); { leap-year Feb is special }
end;
procedure DateDiff(Date1, Date2: TDateTime; var Days, Months, Years: Word);
{ Corrected by Anatoly A. Sanko (2:450/73) }
var
DtSwap: TDateTime;
Day1, Day2, Month1, Month2, Year1, Year2: Word;
begin
if Date1 > Date2 then begin
DtSwap := Date1;
Date1 := Date2;
Date2 := DtSwap;
end;
DecodeDate(Date1, Year1, Month1, Day1);
DecodeDate(Date2, Year2, Month2, Day2);
Years := Year2 - Year1;
Months := 0;
Days := 0;
if Month2 < Month1 then begin
Inc(Months, 12);
Dec(Years);
end;
Inc(Months, Month2 - Month1);
if Day2 < Day1 then begin
Inc(Days, DaysPerMonth(Year1, Month1));
if Months = 0 then begin
Dec(Years);
Months := 11;
end
else Dec(Months);
end;
Inc(Days, Day2 - Day1);
end;
Так, на всякий случай к [7]
did_elena (2006-09-27 17:05:00) [3]Подумала, и получилась такая функция. Осталось дополнить Result, если y=11,12,13,14 и т.п. лет
/ вычисление количества лет, месяцев и дней между двумя датами
function PeriodBetweenDate(const ADateBeg,ADateEnd:TDateTime):string;
var
d1,d2,m1,m2,y1,y2: Word;
d,m,y: Integer;
YLeap : Boolean;
DM : TInteger1DArray;
CF : Integer;
begin
DecodeDate(ADateBeg, y1, m1, d1);
DecodeDate(ADateEnd, y2, m2, d2);
SetLength(DM, 12+1);
YLeap := (Y2 mod 4=0) and ((Y2 mod 100<>0) or (Y2 mod 400=0));
DM[1] := 31;
DM[3] := 31;
DM[4] := 30;
DM[5] := 31;
DM[6] := 30;
DM[7] := 31;
DM[8] := 31;
DM[9] := 30;
DM[10] := 31;
DM[11] := 30;
DM[12] := 31;
if YLeap then
begin
DM[2] := 29;
end
else
begin
DM[2] := 28;
end;
CF := 0;
d := d2-d1;
if d<0 then
begin
d := d+DM[m2];
CF := 1;
end;
m := m2-m1-CF;
CF := 0;
if m<0 then
begin
m := m+12;
CF := 1;
end;
y := y2-y1-CF;
if (y mod 10=0) or (y mod 10>5) then
begin
Result:= IntToStr(y)+' лет '+IntToStr(m)+' мес. '+IntToStr(d)+' дн.';
end
else if (y mod 10=1) then
begin
Result:= IntToStr(y)+' год '+IntToStr(m)+' мес. '+IntToStr(d)+' дн.';
end
else if (y mod 10=2) or (y mod 10=3) or (y mod 10=4) then
begin
Result:= IntToStr(y)+' года '+IntToStr(m)+' мес. '+IntToStr(d)+' дн.';
end;
end;
Галинка (2006-09-22 17:29:00) [4]если это строки. то выделять числа и месяцы и вычитать с ориентацией на количество дней, в зависимости от порядкового номера месяа ))
Johnmen (2006-09-22 16:32:00) [5]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1158810978&n=1
пост [1] читать, думать
Desdechado (2006-09-22 16:31:00) [6]сколько месяцев между 28 февраля и 28 марта?
сколько лет между 3 января 2004 г и 2 января 2005 г?
это к тому, что месяцы и годы имеют РАЗНУЮ длину
did_elena (2006-09-22 16:21:00) [7]можно поподробнее?
например, поле StringGrid.1.Cells[1,n] равно 25.10.2005, а поле StringGrid1.Cells[0,1] равно 19.06.2003, нужно вычислить количество лет, месяцев и дней между ними и записать в StringGrid2.Cells[2,n]
Anatoly Podgoretsky (2006-09-22 16:15:00) [8]Разница не является датой, это интервал.
Sergey13 (2006-09-22 16:13:00) [9]YearsBetween, MonthsBetween, DaysBetween.
Разница в днях еще вычисляется вычитанием.