Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вычисление даты [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.
Разница в днях еще вычисляется вычитанием.


Наверх

Титульная страница Поиск, карта сайта Написать письмо