Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2018, 11:41   #1
ChromeDevils
Новичок
Джуниор
 
Регистрация: 04.07.2012
Сообщений: 2
По умолчанию Delphi расчет дат! Прошу помощи!

Добрый день! Недавно начал работать на Delphi и возникла трудность с расчетом разницы дат и выводом их. Перерыл все что можно, наткнулся на этом форуме на пост с расчетом месяцев и дней, возникла проблема с расчетом года, год у меня считается но с месяцами и днями настоящая беда получается.

код с форума по месяцам и дням - все супер
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
from_date, to_date:TDate;
days,Full_months,i,k:integer;
d1,d2,m1,m2,y1,y2:word;
DayTable:tDayTable;
begin
to_date:=DateTimePicker1.DateTime;
from_date:=DateTimePicker2.DateTime ;

DecodeDate(from_date,y1,m1,d1);
DecodeDate(to_date,y2,m2,d2);


Full_Months:=(y1-y2)*12+(m1-m2);
If d1<d2 then
Full_Months:=Full_Months-1;

Days:=Round(from_date-to_date);
For i:=1 to Full_Months do
begin
DayTable:=MonthDays[IsLeapYear(y2)];
k:=DayTable[m2];
Days:=Days-k;
m2:=m2+1;
If m2>12 then
begin
y2:=y2+1;
m2:=1;
end;
end;

Edit1.Text:=inttostr(Full_months);
Edit2.Text:=inttostr(days);
end;
Вот мои страдания (хочу извиниться программист я не великий, только изучаю)
Код:
var
from_date, to_date:TDate;
days,months,Full_months,i,k,Full_ye ar,a,b:integer;
d1,d2,m1,m2,y1,y2:word;
DayTable:tDayTable;
begin
to_date:=DateTimePicker1.DateTime;
from_date:=DateTimePicker2.DateTime ;

DecodeDate(from_date,y1,m1,d1);
DecodeDate(to_date,y2,m2,d2);

Full_year:= (y1-y2);
If m1<m2 then
Full_year:=Full_year-1;

months:= Round(from_date-to_date);
For a:=1 to Full_year do
begin
DayTable:=MonthDays[IsLeapYear(y2)];
b:= DayTable[y2];
Months:= Months-b;
y2:=y2+1;
if y2>1 then
begin
m2:=m2+1;
y2:=1;
end;
end;

Full_Months:=(y1-y2)*12+(m1-m2);
If d1<d2 then
Full_Months:=Full_Months-1;

Days:=Round(from_date-to_date);
For i:=1 to Full_Months do
begin
DayTable:=MonthDays[IsLeapYear(y2)];
k:=DayTable[m2];
Days:=Days-k;
m2:=m2+1;
If m2>12 then
begin
y2:=y2+1;
m2:=1;
end;
end;

Edit1.Text:=inttostr(Full_months);
Edit3.Text:=inttostr(days);
Edit37.Text:= inttostr(Full_year);

Необходимо реализовать вывод разницы в формате год-месяц-день

Буду очень сильно благодарен за помощь!!!

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 15.03.2018 в 12:10.
ChromeDevils вне форума Ответить с цитированием
Старый 15.03.2018, 12:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

для оформления кода есть кнопка #
ответьте себе на вопросы(замечания) в комментариях кода и исправьте код при необходимости.
Код:
  DecodeDate(from_date,y1,m1,d1);
  DecodeDate(to_date,y2,m2,d2);

  Full_year:= (y1-y2);
  If m1<m2 then Full_year:=Full_year-1;// 25.01.2012 - 19.01.2013 и какое же будет и должно здесь получиться (УЧИТЫВАЯ что m1=m2 а вот с днями ?!)

  months:= Round(from_date-to_date);//это ДНИ а не месяцы.
  For a:=1 to Full_year do
  begin
    DayTable:=MonthDays[IsLeapYear(y2)];// и какое число дней мы здесь узнали
    b:= DayTable[y2]; //а какое число и чего (дней|месяцов?) узнали(определили) здесь
    Months:= Months-b;
....
дальше не смотрел(ибо зачем если все пошло не так)

есть хорошие функции работы с датами
DaysBetween MonthsBetween YearsBetween вполне быть может они справятся с вашей задачей( при небольшой помощи).
и еще множество других. к примеру IncYear IncMonth IncDay
Код:
uses DateUtils; //это где их можно найти(подключить)
а можно все переписать заново
Код:
type
  Tymd: record year, month, day: word; end;

function BetweenYMD(d2, d1: Tdate): TYMD;
var
  dr: Tdate;
  dy, dm, dd: integer;
begin
  dr:=d1;
  dy:=YearsBetween(d2, dr);
  dr:=IncYear(dr, dy);

  dm:=MonthsBetween(d2, dr);
  dr:=IncMonth(dr, dm);

  dd:=DaysBetween(d2, dr);
  dr:=IncDay(dr, dd);
  Assert(dr<>d2, 'ошибка в расчетах');
 
  result.year:=dy;
  result.month:=dm;
  result.day:=dd;
end;
и ее использование

Код:
var
  delta: TYMD;
begin
   delta:=BetweenYMD(DateTimePicture2.Date, DateTimePicture1.Date);
   Edit1.Text:=format('y=%d m=%d d=%d', [delta.year, delta.month, delta.day]);
я конечно же понимаю что здесь для вас внове format, record да и свой тип, но это базис на котором все стоит.
Да код я не проверял, так что ...
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.03.2018 в 13:04.
evg_m вне форума Ответить с цитированием
Старый 15.03.2018, 13:14   #3
ChromeDevils
Новичок
Джуниор
 
Регистрация: 04.07.2012
Сообщений: 2
По умолчанию

Спасибо большое, очень полезно для меня!
ChromeDevils вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прошу помощи, проект браузер Delphi . prostoshift1 Помощь студентам 5 16.04.2015 19:23
Прошу помощи по delphi, гарантированно заплачу. Fisgard Фриланс 4 16.05.2014 22:39
Прошу вашей помощи. Работа с массивами и типизированными файлами (Delphi) dandikon Помощь студентам 2 02.11.2013 15:17
Обновление дат при помощи макроса alexp21 Microsoft Office Excel 2 26.09.2013 14:56
Delphi прошу помощи у профессионалов Тёмыч Помощь студентам 5 12.05.2008 23:48