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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.08.2009, 13:08
Kara1989 Kara1989 вне форума
Прохожий
 
Регистрация: 05.06.2009
Сообщения: 12
Репутация: 10
По умолчанию Datetimepicker

народ, нужна помощь!!
надо посчитать разницу двух дат (Datetimepicker - 1,2), чтобы в ответе указать сколько лет, сколько месяцев и сколько дней между двух указанных дат!!!

например, 06.01.1980 (Datetimepicker1) - 01.01.1982 (Datetimepicker2)
ответ должно быть так: 1 год 11 месяцев 26 дней

я пробовал так:
Form1.Edit1.Text:=inttostr(trunc(Form1.datetimepic ker2.date)-(Form1.datetimepicker1.date));
но мой ответ выходить только разницы по дням

Заранее спасибо!!!
Ответить с цитированием
  #2  
Старый 03.08.2009, 08:31
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А как ты себе представляешь разницу дат в твоем виде? Годы бывают високосными, в месяцах не одинаковое количество дней. Так что разницу можно получить только в днях.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 03.08.2009, 09:39
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от Kara1989
... например, 06.01.1980 (Datetimepicker1) - 01.01.1982 (Datetimepicker2) ответ должно быть так: 1 год 11 месяцев 26 дней ...

Похоже, что для отдела кадров.
Все зависит от конкретной задачи.
Если в общем случае, все равно придется писать ручками свой инструментарий. Потому что придется учитывать праздничные и выходные дни, а также - их переносы ...
Вероятно, надо вести какой-то внутренний календарь, "пробегать" период по месяцам и вычислять самому.
Если же без календаря, то может быть помогут такие функции (когда-то для ОК писАл) :

Код:
function Get_CountDays_In_Year(Ye : integer) : integer;
//Кол-во дней в заданном году
begin
  Result:=365;
  if Ye>0 then begin
     if IsLeapYear(Ye) then Result:=366;
  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;


Кроме этого, могут быть случаи, когда для вычисления достаточно считать, что в месяце 30 дней (усредненно).
Тогда, может быть устроит такой подход (старая функция, но вроде бы рабочая) :

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


function Date2ymd_minus_Date1ymd_YMD_30(Ye1,Mo1,Da1, Ye2,Mo2,Da2 : integer;
                                        Var DeltaY,DeltaM,DeltaD : integer) : boolean;
//Вычислисть разницу двух дат (кол-во лет, меясцев, дней)
//С учетом того, что в месяце 30 дней (усредненно)
Var
  Nr : integer;
begin
  Result:=false;
  DeltaD   := 0;
  DeltaM   := 0;
  DeltaY   := 0;
  if IsDateYMD(Ye1,Mo1,Da1) then begin  //проверяем Дата1 на корректность
     if IsDateYMD(Ye2,Mo2,Da2) then begin //проверяем Дата2 на корректность
        Nr:=Compare_Dates_YMD(Ye1,Mo1,Da1, Ye2,Mo2,Da2);  //сравниваем период дат (провекрка на корректность)
        if Nr<=0 then begin //Дата1 <= Дата2
           Result:=true;
           if Nr<0 then begin   //Дата1 < Дата2
              DeltaD:=Da2-Da1;
              if DeltaD<0 then begin
                 Da2:=Da2+30; //Считаем, что в месяце 30 дней
                 Mo2:=Mo2-1;
              end;
              DeltaD:=Da2-Da1;
              DeltaM:=Mo2-Mo1;
              if DeltaM<0 then begin
                 Mo2:=Mo2+12;
                 Ye2:=Ye2-1;
              end;
              DeltaM:=Mo2-Mo1;
              DeltaY:=Ye2-Ye1;
           end;
        end;
     end;
  end;
end;
  
function Get_IDDateYMD(Y,M,D : integer) : integer;
//Вычислить ID даты (YMD)
begin
  Result:=Y*10000+M*100+D;
end;
  
function IsDateYMD(Ye,Mo,Da : integer) : boolean;
//Проверить корректность даты  YMD
begin
  Result:=false;
  if (Ye>=Get_FirstYear_for_Greg) 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 Compare_Dates_YMD(Ye1,Mo1,Da1,Ye2,Mo2,Da2 : integer) : integer;
//26.05.2009
{Сравнение дат}
//Дата1: Ye1,Mo1,Da1  (год,мес,день)           
//Дата2: Ye2,Mo2,Da2  (год,мес,день)      
Var
 id1,id2 : integer;
begin
  Result:=-99; //Ошибка                      
  id1:= Get_IDDateYMD(Ye1,Mo1,Da1);
  id2:= Get_IDDateYMD(Ye2,Mo2,Da2);
  if (id1>0) and (id2>0) then begin
     Result:=0;  //Даты равны                               
     if id1>id2 then begin
        Result:=1; //Дата1>Дата2                             
     end
     else begin
        if id1<id2 then begin
           Result:=-1; //Дата1<Дата2  
        end;
     end;
  end;
end;
    
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter