Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
42 / 10 / 0
Регистрация: 17.05.2011
Сообщений: 123

Функция подсчета разницы дат

18.08.2011, 17:19. Показов 3653. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с функцией, проект не компилируется.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
procedure TForm1.Button1Click(Sender: TObject);
var BeginDate, EndDate: TDateTime;
begin
BeginDate:=StrToDate(Edit1.Text);
EndDate:=StrToDate(Edit2.Text);
 
Label1.Caption:=DateToStr(GetMonthsCount(BeginDate, EndDate)); \\ ошибка на этой строке, нет актуальных параметров.
end;
 
 
 
function TForm1.GetMonthsCount(BeginDate, EndDate: TDateTime; var DaysCount: Byte): Integer;
var
  Days1, Days2,             // количество дней начальной и конечной дат
  Months1, Months2,         // количество месяцев начальной и конечной дат
  Years1, Years2: Integer;  // количество лет начальной и конечной дат
  BufferDate: TDateTime;    // буфер для обмена значениями
begin
  if BeginDate > EndDate then  // сравниваем даты, если начальная позднее
  begin                        // конечной, то меняем даты между собой
    BufferDate := BeginDate;
    BeginDate := EndDate;
    EndDate := BufferDate;
  end;
  Days1 := StrToInt(FormatDateTime('dd', BeginDate));     // считываем количе-
  Days2 := StrToInt(FormatDateTime('dd', EndDate));       // ство дней, месяцев
  Months1 := StrToInt(FormatDateTime('mm', BeginDate));   // и лет каждой из дат
  Months2 := StrToInt(FormatDateTime('mm', EndDate));     // и заносим в соот-
  Years1 := StrToInt(FormatDateTime('yyyy', BeginDate));  // ветствующие пере-
  Years2 := StrToInt(FormatDateTime('yyyy', EndDate));    // менные
  // Вычисляем суммарную разницу между датами по разницам в годах*12 и месяцах
  Result := (Years2 - Years1) * 12 + (Months2 - Months1);
  // Учитываем влияние разницы в днях на количество месяцев + остаток в днях в
  // переменной DaysCount
  if (Days2 - Days1) < 0 then
  begin  // если разница отрицательна, то
    Result := Result - 1;  // производим заем месяца из имеющихся
    // В зависимости от месяца в "меньшей" дате, вычисляем остаток в днях
    case Months1 of
      1, 3, 5, 7, 8, 10, 12: DaysCount := 31 - Days1 + Days2;
      4, 6, 9, 11: DaysCount := 30 - Days1 + Days2;
      // В случае февраля учитываем также високосность года
      2: if (Years2 mod 4 = 0) and (Years2 mod 100 <> 0) then
           DaysCount := 29 - Days1 + Days2
         else
           if (Years2 mod 100 = 0) and (Years2 mod 400 = 0) then
             DaysCount := 29 - Days1 + Days2
           else
             DaysCount := 28 - Days1 + Days2;
    end;
  end  // конец действий при отрицательной разнице дней
  else  // при положительной или нулевой разнице дней
    DaysCount := Days2 - Days1;  // банальная разность
end;
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2011, 17:19
Ответы с готовыми решениями:

Получение разницы в годах из двух дат
procedure TfEditor.Button4Click(Sender: TObject); var tt: Tdate; nn:Tdate; begin tt:= strtodate('12.12.12'); nn :=...

Функция определения разницы во времени в секундах
В работе потока необходимо соблюсти интервал для срабатывания функции работает поток - собирает информацию (нет точного времени) ...

Функция для подсчета
Помогите написать функцию для подсчета у которых первые и последние символы совпадают Например CountBeginEnd('Тут какой нить текст')...

8
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
18.08.2011, 17:32
Параметром функции DateToStr() должна быть константа типа TDateTime, а не integer;
Приведи значение своей функции к типу TDateTime
0
42 / 10 / 0
Регистрация: 17.05.2011
Сообщений: 123
18.08.2011, 18:04  [ТС]
Так?
Delphi
1
function TForm1.GetMonthsCount(BeginDate, EndDate: TDateTime; var DaysCount: Byte): TDateTime;
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
18.08.2011, 18:23
Delphi
1
result :=  (MonthOf(EndDate-BeginDate)+YearOf(EndDate-BeginDate)*12) - (MonthOf(0)+YearOf(0)*12);
Добавлено через 4 минуты
Ах, там еще дни..

Delphi
1
DaysCount := DaysBetween(BeginDate,EndDate);
Добавлено через 5 минут
var
qd: integer;

Label1.Caption:='Месяцев '+IntToStr(GetMonthsCount(BeginDate, EndDate,qd)+', дней '+IntToStr(qd));

Ну и функция будет выглядет так:

Delphi
1
2
3
4
5
function TForm1.GetMonthsCount(BeginDate, EndDate: TDateTime; var DaysCount: Byte): Integer;
begin
  result :=  (MonthOf(EndDate-BeginDate)+YearOf(EndDate-BeginDate)*12) - (MonthOf(0)+YearOf(0)*12); 
  DaysCount := DaysBetween(BeginDate,EndDate);
end;
Добавлено через 1 минуту
Ах, чуть не забыл
Delphi
1
uses DateUtils
0
42 / 10 / 0
Регистрация: 17.05.2011
Сообщений: 123
18.08.2011, 18:35  [ТС]
Дело в том, что функция эта уже готовая и рабочая, в нее не нужно ничего больше добавлять, но как реализовать ее работу на примере не знаю, посмотрите проект, т.к. выдает каккую-то ерунду в Label.
В label хотелось бы чтобы было: ** лет ** месяцев ** дней
Вложения
Тип файла: zip pack.zip (5.5 Кб, 35 просмотров)
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
18.08.2011, 20:18
Если Вы после [4] не в состоянии самостоятельно определить к-во лет.. впору подумать о смене профессии.
Кроме того Ваша "готовая и рабочая" функция, мягко говоря, не оптимальная. К тому же мне кажется что сокрвщение кода на 40 строк это уже само по себе плюс//
0
42 / 10 / 0
Регистрация: 17.05.2011
Сообщений: 123
19.08.2011, 22:45  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Если Вы после [4] не в состоянии самостоятельно определить к-во лет.. впору подумать о смене профессии.
Кроме того Ваша "готовая и рабочая" функция, мягко говоря, не оптимальная. К тому же мне кажется что сокрвщение кода на 40 строк это уже само по себе плюс//
Если Вы такой крутой программист то покажите проект, который работает без 40 строк лишнего кода.
0
731 / 407 / 95
Регистрация: 19.12.2010
Сообщений: 756
20.08.2011, 11:08
А может так?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
  var d1,d2:tdatetime;
   res:real;
   mes,god,Den:Integer;
   c:string;
begin
 d1:=strtodatetime(edit2.Text);
 d2:=strtodatetime(edit3.Text);
 Res:=d1-d2;
 Res:=abs(Res);
 god:= trunc(Res/365);
 mes:= Trunc((Res - god * 365) / 30);
 Den:= trunc(Res-god*365-mes*30);
 lbl3.caption:='Дней '+IntToStr(Den)+' Месяцев '+inttostr(mes)+' Лет '+inttostr(god);
 end;
0
42 / 10 / 0
Регистрация: 17.05.2011
Сообщений: 123
20.08.2011, 13:01  [ТС]
Цитата Сообщение от 19vitek Посмотреть сообщение
А может так?
Так-то работает, только у Вас количество дней в месяце округлено до 30-ти, а также не учитываются високосные года и февраль месяц (28, 29) дней.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.08.2011, 13:01
Помогаю со студенческими работами здесь

Сравнение двух дат и вывод дат находящихся между ними
Здравствуйте! Тут такое дело, вводятся две определенные ДАТЫ в Edit1 и Edit2 в формате ДД.ММ.ГГГГ, нужно найти все ДАТЫ, которые...

Расчёт разницы дат в БД
Назрел новый вопрос: Имеется БД созданная в MS Access Три столбца - 1 Событие 2 Дата 3 Количество дней с предыдущего события ...

Вывод разницы дат
Скажите пожалуйста как вывести разницу всех дат. Например у меня есть дата 19.03.2013 записана в echo &quot;&lt;input...

Вычисление разницы дат
Имеется код: char firstDate = &quot;2015-07-09&quot;; char secondDate = &quot;2015-07-07&quot;; char* format = &quot;%Y-%m-%d&quot;; struct tm tm; ...

CHECK разницы дат
Хочу сравнить две даты с помощью ограничения CHECK, но компилятор выдаёт ошибку. DATEDIFF(year, , ) &gt; 18 DATEDIFF же возвращает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru