Показать сообщение отдельно
  #4  
Старый 12.11.2010, 22:28
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Когда-то нашел (где-то) формулу, которая вычисляет кол-во дней от начала Григорианского календаря (по-моему, 15.10.1582-пятница).

В реализации на pascal выглядит так (тип real остался, как реликт, когда integer был 2-х байтовым):

Код:
function Size_DateYMD(Ye,Mo,Da : integer) : real;
{"Размер" Даты}
Var
  BufY,BufM,BufD : real;
begin
  Result:=0;
  BufY:=Ye;
  BufM:=Mo;
  BufD:=Da;
  if (Mo>0) and (Mo<=2) then begin
     Result :=  trunc(365*BufY)
              + trunc(BufD)
              + trunc(31*(BufM-1))
              + trunc((BufY-1)/4)
              - trunc(3/4*(trunc(BufY-1)/100+1));
  end;
  if (Mo>2) and (Mo<=12) then begin
     Result :=  trunc(365*BufY)
              + trunc(BufD)
              + trunc(31*(BufM-1))
              - trunc(0.4*BufM+2.3)
              + trunc(BufY/4)
              - trunc(3/4*(trunc(BufY/100)+1));
  end;
end;


Применение примерно такое :
Код:
function Date2ymd_minus_Date1ymd(Ye1,Mo1,Da1, Ye2,Mo2,Da2 : integer) : integer;
{Кол-во дней между датами в формате YMD}
begin
  Result:=-1;
  if IsDateYMD(Ye1,Mo1,Da1) then begin      //дата-1 корректна
     if IsDateYMD(Ye2,Mo2,Da2) then begin   //дата-2 корректна
        if Get_IDDateYMD(Ye1,Mo1,Da1)<=Get_IDDateYMD(Ye2,Mo2,Da2) then begin
           //период дат корректен
           //Вычисляем кол-во дней между датами
==>        Result:=trunc(Size_DateYMD(Ye2,Mo2,Da2) - Size_DateYMD(Ye1,Mo1,Da1));  
           if Result<0 then begin
              Result:=-1;
           end;
        end;
     end;
  end;
end;


И т.д.
Ответить с цитированием