Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
Внизвычисление даты Найти похожие ветки
← →
did_elena © (2006-09-22 16:06) [0]может, кто-нибудь поможет в таком вопросе:
нужно посчитать разницу между двумя полями в формате даты в StringGridе и записать результат в поле другого StringGridа в таком, например, виде: 5 лет 3 мес. 20 дн.
← →
Sergey13 © (2006-09-22 16:13) [1]YearsBetween, MonthsBetween, DaysBetween.
Разница в днях еще вычисляется вычитанием.
← →
Anatoly Podgoretsky © (2006-09-22 16:15) [2]Разница не является датой, это интервал.
← →
did_elena © (2006-09-22 16:21) [3]можно поподробнее?
например, поле StringGrid.1.Cells[1,n] равно 25.10.2005, а поле StringGrid1.Cells[0,1] равно 19.06.2003, нужно вычислить количество лет, месяцев и дней между ними и записать в StringGrid2.Cells[2,n]
← →
Desdechado © (2006-09-22 16:31) [4]сколько месяцев между 28 февраля и 28 марта?
сколько лет между 3 января 2004 г и 2 января 2005 г?
это к тому, что месяцы и годы имеют РАЗНУЮ длину
← →
Johnmen © (2006-09-22 16:32) [5]http://delphimaster.net/view/3-1158810978/
пост [1] читать, думать
← →
Галинка © (2006-09-22 17:29) [6]если это строки. то выделять числа и месяцы и вычитать с ориентацией на количество дней, в зависимости от порядкового номера месяа ))
← →
did_elena © (2006-09-27 17:05) [7]Подумала, и получилась такая функция. Осталось дополнить 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;
← →
RASkov (2006-09-27 20:36) [8]Вот верезка из 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]
← →
Aleks © (2006-09-28 09:22) [9]unit:
DateUtil --- Äîáàâèòü â uses
DaysBetween - Âû÷èñëÿåò ÷èñëî äíåé ìåæäó äàòàìè Date1 è Date2,
MonthsBetween - Ôóíêöèÿ âû÷èñëÿåò ÷èñëî ìåñÿöåâ ìåæäó äâóìÿ äàòàìè.
С годами я думаю проблем не будет :)
на всякий случай
DecodeDate ðàçáèâàåò äàòó Date íà ãîä - Year, ìåñÿö - Month è äåíü - Day
Пример:
DecodeDate(Date,Year,Month,Day);
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c