Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2009, 17:50
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Как считать дни до определенной даты

Ребя всем привет - уже который день мучает вопрос - как на дельфи считать сколько дней с одного числа до другого например

с 04.12.2009 до 15.03.2011 года???
Ответить с цитированием
  #2  
Старый 04.12.2009, 18:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

DaysBetween в модуле DateUtils. Только внимательно прочитай доку на эту функцию.
Ответить с цитированием
  #3  
Старый 04.12.2009, 18:18
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Спасибо огромное за помошь!
Код:
var
fromdate, toDate : TDateTime;
begin
// Установка наших переменных дат
fromDate := EncodeDateTime(2000, 02, 26, 10, 0, 0, 0);
toDate   := EncodeDateTime(2000, 02, 29,  9, 0, 0, 0);
// Отображение этих дат и дней между ними
ShowMessage('С даты = '+DateTimeToStr(fromDate));
ShowMessage('До даты = '+DateTimeToStr(toDate));
ShowMessage('Целых дней = '+IntToStr(DaysBetween(toDate, fromDate))+' дней');
end;

С даты = 26/02/2000 10:00:00
До даты = 29/02/2000 09:00:00
Целых дней = 2 дней
Ответить с цитированием
  #4  
Старый 04.12.2009, 19:33
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию Может будет полезно ...

Григорианский календарь был введён папой Григорием XIII 4 октября 1582 года взамен старого юлианского:
следующим днём после четверга, 4 октября стала пятница, 15 октября (дней с 5 по 14 октября 1582 в григорианском календаре нет).
В григорианском календаре длина тропического года принимается равной 365,2425 суток.
Длительность не високосного года — 365 суток, високосного — 366.
Ответить с цитированием
  #5  
Старый 04.12.2009, 19:36
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию И несколько функций (может пригодятся).

Код:
Const
  Date_GrigFirstYear = 1582;//самый первый год (Григорианского календаря), корректный для использования функций работы с датами
  Date_GrigFirstDate = '15.10.1582' {пятница}; //самая первая дата (Григорианского календаря), корректная для использования функций работы с датами


function Date2str_minus_Date1str(sDate1, sDate2 : string) : integer;
{Кол-во дней между датами в формате String}
Var
  Ye1,Mo1,Da1,
  Ye2,Mo2,Da2 : integer;
begin
  Result:=-1;
  if DateStr_to_DateYMD(sDate1,Ye1,Mo1,Da1) then begin
     if DateStr_to_DateYMD(sDate2,Ye2,Mo2,Da2) then begin
        Result:=Date2ymd_minus_Date1ymd(Ye1,Mo1,Da1,Ye2,Mo2,Da2);
     end;
  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(DateYMD_Size(Ye2,Mo2,Da2) - DateYMD_Size(Ye1,Mo1,Da1));
           if Result<0 then begin
              Result:=-1;
           end;
        end;
     end;
  end;
end;



function DateYMD_Size(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 DateStr_to_DateYMD(sDate : string; Var Ye,Mo,Da : integer) : boolean;
//Конвертировать дату из String в YMD
Var
  DT : TDateTime;
  Yw,Mw,Dw : word;
begin
  Result:=false;
  Ye:=0;
  Mo:=0;
  Da:=0;
  sDate:=trim(sDate);
  if length(sDate)>0 then begin
     if SysUTILS.TryStrToDate(sDate,DT) then begin
        Result:=true;
        DecodeDate(DT, Yw, Mw, Dw);
        Ye:=Yw;
        Mo:=Mw;
        Da:=Dw;
     end;
  end;
end;


function DateStr_Size(sDate : string) : real;
//"Размер" Даты в формате Строка
Var
  Ye,Mo,Da : integer;
begin
  Result:=0;
  if DateStr_to_DateYMD(sDate, Ye,Mo,Da) then begin
     Result:=DateYMD_Size(Ye,Mo,Da);
  end;
end;

function IsDateYMD(Ye,Mo,Da : integer) : boolean;
//Проверить корректность даты  YMD
begin
  Result:=false;
  if (Ye>=Date_GrigFirstYear) then begin
     if (Ye<=3100) then begin
        if (Mo>0) and (Mo<=12) then begin
           if (Da>0) then begin
              if (Da<=Get_CountDays_In_Month(Ye,Mo)) then begin
                 Result:=true;
              end;
           end;
        end;
     end;
  end;
end;
function Get_CountDays_In_Month(Ye, Mo : integer) : integer;
//Кол-во дней в заданном месяце
begin
  Result:=0;
  if Ye>0 then begin
     if (Mo>0) and (Mo<=12) then begin
        Result:=30;
        if Mo=2 then begin
           Result:=28;
           if IsLeapYear(Ye) then Result:=29;
        end
        else begin
          if (Mo in [1,3,5,7,8,10,12]) then Result:=31;
        end;
      end;
  end;
end;

function Get_IDDateYMD(Y,M,D : integer) : integer;
//Вычислить ID даты (YMD)
begin
  Result:=Y*10000+M*100+D;
end;

Последний раз редактировалось roamer, 04.12.2009 в 19:41.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025