Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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  --- &#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.056 c
2-1159343114
Dr. Genius
2006-09-27 11:45
2006.10.15
Объявление модулей в interface и implementation


15-1159256648
Sandman29
2006-09-26 11:44
2006.10.15
Коммерсант-Власть


15-1158872352
Eraser
2006-09-22 00:59
2006.10.15
Просьба протестировать сайт


10-1124370623
Lotus
2005-08-18 17:10
2006.10.15
Достучаться до текста в ячейке таблицы Ворда


2-1159036198
PrXaos
2006-09-23 22:29
2006.10.15
WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский