Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

вычисление даты   Найти похожие ветки 

 
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  --- &#196;&#238;&#225;&#224;&#226;&#232;&#242;&#252; &#226; uses

DaysBetween - &#194;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#242; &#247;&#232;&#241;&#235;&#238; &#228;&#237;&#229;&#233; &#236;&#229;&#230;&#228;&#243; &#228;&#224;&#242;&#224;&#236;&#232; Date1 &#232; Date2,
MonthsBetween - &#212;&#243;&#237;&#234;&#246;&#232;&#255; &#226;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#242; &#247;&#232;&#241;&#235;&#238; &#236;&#229;&#241;&#255;&#246;&#229;&#226; &#236;&#229;&#230;&#228;&#243; &#228;&#226;&#243;&#236;&#255; &#228;&#224;&#242;&#224;&#236;&#232;.

С годами я думаю проблем не будет :)
на всякий случай
DecodeDate &#240;&#224;&#231;&#225;&#232;&#226;&#224;&#229;&#242; &#228;&#224;&#242;&#243; Date &#237;&#224; &#227;&#238;&#228; - Year, &#236;&#229;&#241;&#255;&#246; - Month &#232; &#228;&#229;&#237;&#252; - Day
Пример:
DecodeDate(Date,Year,Month,Day);



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
2-1159276169
Asdpro
2006-09-26 17:09
2006.10.15
Создание меню из дерева каталогов и файлов


15-1159002267
SergP
2006-09-23 13:04
2006.10.15
Род Стивене "Delphi Готовые алгоритмы.". Стоит ли качать?


3-1155295013
Lexiy
2006-08-11 15:16
2006.10.15
Оптимизация запросов


2-1159273579
Alex_C
2006-09-26 16:26
2006.10.15
Как получить canvas элемента?


15-1158733932
Проггер
2006-09-20 10:32
2006.10.15
перенос D5