Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153

Как вычислить кол-во дней между двумя датами и перевести в кол-во лет, мес. дней?

05.12.2019, 10:21. Показов 6897. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, как вычислить кол-во дней я знаю:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button3Click(Sender: TObject);
var D1,D2,Razn:integer;
begin
D1:=Trunc(StrToDate(Edit3.Text));   //Дата 1
D2:=Trunc(StrToDate(Edit4.Text));   //Дата 2
Razn:=D2-D1;
Label1.Caption:=IntToStr(Razn)+' дн.';
end;
Здесь у меня одна дата находится в Edit3 (01.12.2019), вторая - в Edit4 (31.12.2019).

А вот как теперь это кол-во дней перевести в кол-во лет, месяцев и дней и вывести в Label1.Caption?
И еще, если можно - текстовое наименование "месяцы" и "дни" (для вывода в Label1) я собираюсь использовать в сокращенном виде: "мес." и "дн.", а вот для лет хотелось бы текст менять: если 1 год, то "год", 2 года - "года", 5 лет - "лет".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2019, 10:21
Ответы с готовыми решениями:

Как лучше посчитать кол-во дней между двумя датами?
"10/12/1989" 23/02/2016" Как посчитать лучше кол-во дней между ними?

Возврат кол-ва лет, месяцев, дней, часов, минут, секунд между датами
Нужно написать функцию которая возвращает в виде символьной строки количество лет, месяцев, дней, часов, минут и секунд между указанными...

Написать программу, считающую кол-во дней между двумя заданными датами!
Помогите новичку!!! Нужно написать программу, позволяющую сосчитать количество дней между двумя заданными датами. С учетом високосных...

19
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
05.12.2019, 11:36
Цитата Сообщение от Vladimus Посмотреть сообщение
А вот как теперь это кол-во дней перевести в кол-во лет, месяцев и дней и вывести в Label1.Caption?
а нет тут красивого решения.
вот, от 30 января до 30 марта сколько прошло месяцев?
от от 31 января до 1 марта сколько?
а от 29 февраля 2016 до 28 февраля 2018 сколько прошло лет месяцев дней?
и много ещё примеров можно привести, когда результат спорный.

а тебе это зачем?

Добавлено через 4 минуты
поиграйся с этим онлайн калькулятором - https://planetcalc.ru/274/
тебе такое нужно?

Добавлено через 22 минуты
подумал, а может всё проще.
попробуй готовые функции

Delphi
1
2
3
function YearsBetween(const ANow, AThen: TDateTime): Integer;
function MonthsBetween(const ANow, AThen: TDateTime): Integer;
function DaysBetween(const ANow, AThen: TDateTime): Integer;
1
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
05.12.2019, 13:55  [ТС]
Подскажите, как вычислить количество дней в месяце по дате: 01.02.2020 (эта дата находится в Edit3.Text).
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
05.12.2019, 13:58
Delphi
1
2
3
4
5
uses ..., DateUtils;
...
var DayCount: word;
...
DayCount := DayOfTheMonth(StrToDate(Edit3.Text));
1
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
05.12.2019, 15:17  [ТС]
Нет, не текущий день вывести надо, а количество дней в текущем месяце: 01.02.2020 (эта дата находится в Edit3.Text).

Добавлено через 29 минут
Все, нашел:
Delphi
1
Label1.Caption:=IntToStr(DaysInMonth(StrToDate(Edit3.Text)));
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
05.12.2019, 15:18
Цитата Сообщение от Vladimus Посмотреть сообщение
а количество дней в текущем месяце
Delphi
1
2
function DaysInMonth(const AValue: TDateTime): Word;
function DaysInAMonth(const AYear, AMonth: Word): Word;
1
05.12.2019, 15:21

Не по теме:

Цитата Сообщение от Vladimus Посмотреть сообщение
DaysInMonth
Да, блин, ну конечно же!!! Думаю одно - пишу другое...

0
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
06.12.2019, 21:44  [ТС]
Вроде бы получилось, что я хотел. Пока ошибок не нашел.
Если интересно - полюбопытствуйте.
Вложения
Тип файла: rar Расчет времени между двумя датами.rar (836.8 Кб, 111 просмотров)
0
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
07.12.2019, 08:27  [ТС]
Забыл поставить перехватчик ошибок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button3Click(Sender: TObject);
var MonCount1,MonCount2,D_od,F_MC,SY,SM,SD:integer;
    S,SY_v:string;
    D,Dend:TDateTime;
begin
 
 if (Edit3.Text='') or (Edit4.Text='') then
 begin
  Application.MessageBox('Введены не все данные', 'Ошибка!', MB_ICONEXCLAMATION);
  Exit;
 end;
 
RichEdit1.Lines.Clear;
SY:=0;                  //Счетчик лет
SM:=0;                  //Счетчик месяцев
SD:=0;                  //Счетчик дней
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
07.12.2019, 17:30
Цитата Сообщение от Vladimus Посмотреть сообщение
Забыл поставить перехватчик ошибок:
Ну, прямо скажу, перехватчик Ваш - не перехватчик вовсе, а так себе...
Вот, предположим, я ввел в эти самые Edit3 и Edit4 по пробелу, ну или по букве какой... Они пустые? Нет!!! Значит обработка пойдет далее... А к чему она приведет? К вылету программы... И что, это нормально?
0
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
07.12.2019, 17:57  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Ну, прямо скажу, перехватчик Ваш - не перехватчик вовсе, а так себе...
Вот, предположим, я ввел в эти самые Edit3 и Edit4 по пробелу, ну или по букве какой... Они пустые? Нет!!! Значит обработка пойдет далее... А к чему она приведет? К вылету программы... И что, это нормально?
Не надо ля-ля, вы бы программку сначала запустили, а потом говорили.
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
07.12.2019, 18:05
Цитата Сообщение от Vladimus Посмотреть сообщение
вы бы программку сначала запустили, а потом говорили
Запустил... И поэтому говорю...
Миниатюры
Как вычислить кол-во дней между двумя датами и перевести в кол-во лет, мес. дней?  
0
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
07.12.2019, 18:33  [ТС]
Я же писал:
Цитата Сообщение от Vladimus Посмотреть сообщение
Забыл поставить перехватчик ошибок: ...
Добавьте его и все будет пучком. У себя я поправил, но не стал перезаливать архив, кому понадобится - разберется.
Это моя задача, я просто ею поделился, я не выполняю здесь чей-то заказ.
Просто было сказано:
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
а нет тут красивого решения.
вот, от 30 января до 30 марта сколько прошло месяцев?
от от 31 января до 1 марта сколько?
а от 29 февраля 2016 до 28 февраля 2018 сколько прошло лет месяцев дней?
и много ещё примеров можно привести, когда результат спорный.
А я ее решил и решил поделиться. Когда заметил, что не вставил перехватчик, было уже поздно редактировать сообщение.
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
07.12.2019, 18:41
Цитата Сообщение от Vladimus Посмотреть сообщение
я не выполняю здесь чей-то заказ
А тут никто ничьи заказы, если что, не выполняет... Это бесплатный раздел, тут нет никаких заказов...

Не по теме:

Если хотите поделиться - да ради бога, только делиться надо рабочим кодом, а не таким, к которому потом поправки идут с намеками "кому надо, тот разберется"... Кому действительно надо - тот сам сделает, без вот этой Вашей, простите мне мой хранцусский, белиберды...

0
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
07.12.2019, 20:20  [ТС]
Пожалуйста, код:
Кликните здесь для просмотра всего текста
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
unit UCalend1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Vcl.Buttons, Vcl.ExtCtrls, DateUtils;
 
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Edit3: TEdit;
    Label6: TLabel;
    Label14: TLabel;
    Edit4: TEdit;
    Label16: TLabel;
    MonthCalendar1: TMonthCalendar;
    MonthCalendar2: TMonthCalendar;
    Button3: TButton;
    Label1: TLabel;
 
    procedure MonthCalendar1Click(Sender: TObject);
    procedure MonthCalendar2Click(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button3Click(Sender: TObject);
var MonCount1,MonCount2,D_od,F_MC,SY,SM,SD:integer;
    S,SY_v:string;
    D,Dend:TDateTime;
begin
 
 if (Edit3.Text='') or (Edit4.Text='') then
 begin
  Application.MessageBox('Введены не все данные', 'Ошибка!', MB_ICONEXCLAMATION);
  Exit;
 end;
 
RichEdit1.Lines.Clear;
SY:=0;                  //Счетчик лет
SM:=0;                  //Счетчик месяцев
SD:=0;                  //Счетчик дней
 
D:=StrToDate(Edit3.Text);      //Перевести текущее строковое содержимое окна "Начальная дата" в дату
Dend:=StrToDate(Edit4.Text);   //Перевести текущее строковое содержимое окна "Конечная дата" в дату
 
 if D>=Dend then
 begin
  Application.MessageBox('Начальная дата не должна быть равна Конечной дате или превышать ее', 'Ошибка!', MB_ICONEXCLAMATION);
  Exit;
 end;
 
D_od:=DayOfTheMonth(StrToDate(Edit3.Text)); //Первый день
MonCount1:=MonthOfTheYear(D);               //Номер месяца из даты первого дня
 
F_MC:=1;                                    //Флаг, показывающий, что в текущем месяце новый месяц уже был
                                            //приплюсован к счетчику месяцев - первый месяц не считаем
repeat
 D:=D+1;                                  //Увеличить текущую дату на 1 день (При запуске цикла сразу увеличиваем дату на 1 день, т.к. первый день не считается)
 SD:=SD+1;                                //Увеличить на 1 счетчик дней
 
 MonCount2:=MonthOfTheYear(D);            //Номер текущего месяца из текущей даты
 
 if MonCount1<>MonCount2 then            //Проверка - не наступил ли новый месяц?
  begin
   MonCount1:=MonCount2;                 //Наступил новый месяц - запомнить его номер,
   F_MC:=0;                              //и обнулить счетчик месяцев - готовность приплюсовать новый месяц
  end;
 
 if DayOfTheMonth(D)<>D_od then            //Если номер текущего дня не равен номеру первого дня, то
  begin
   if (DayOfTheMonth(D)=DaysInMonth(D))and(F_MC=0) then //надо узнать не достигнут ли последний день в текущем
    begin                                               //месяце и, если в текущем месяце новый месяц
     SM:=SM+1;                                          //приплюсован не был, то увеличить счетчик месяцев на 1
     SD:=0;                                             //Обнулить счетчик дней
    end
    else
     begin
                                                        //Здесь что-нибудь делаем
     end;
  end
  else
   begin
    SM:=SM+1;                             //Текущий день нового месяца равен первому дню - значит прошел очередной месяц и надо увеличить счетчик месяцев на 1
    F_MC:=1;                              //Запомнить, что в текущем месяце счетчик месяцев уже увеличен на 1
    SD:=0;                                //Обнулить счетчик дней
   end;
 
 if SM=12 then
  begin
   SM:=0;
   SY:=SY+1;
  end;
 
 S:=FormatDateTime('dd.mm.yyyy г.',D);
 
 case SY of 1,21,31,41,51,61,71,81,91,101:SY_v:='год';
            2,3,4,22,23,24,32,33,34,42,43,44,52,53,54,62,63,64,72,73,74,82,83,84,92,93,94:SY_v:='года';
 else SY_v:='лет';
 end;
 
 Label1.Caption:=IntToStr(SY)+' '+SY_v+' '+IntToStr(SM)+' мес. '+IntToStr(SD)+' дн.  '+'(всего: '+IntToStr(DaysBetween(StrToDate(Edit4.Text),StrToDate(Edit3.Text)))+' дн.)';
 RichEdit1.Lines.Add(S+': '+IntToStr(SY)+' '+SY_v+' '+IntToStr(SM)+' мес. '+IntToStr(SD)+' дн.');
 
until D=Dend;
 
end;
 
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
  Key := Chr(0); //Запретить ввод любых символов - здесь вводится дата с календаря
end;
 
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
  Key := Chr(0); //Запретить ввод любых символов - здесь вводится дата с календаря
end;
 
procedure TForm1.MonthCalendar1Click(Sender: TObject);
begin
 Edit3.Text:= DateToStr(MonthCalendar1.date); //Начальная дата
 Form1.SetFocus;
end;
 
procedure TForm1.MonthCalendar2Click(Sender: TObject);
begin
 Edit4.Text:= DateToStr(MonthCalendar2.date); //Конечная дата
 Form1.SetFocus;
end;
 
end.


Скажите, у вас здесь на форуме, наверное, есть друзья? Если бы вот такую программу, вот в таком виде выложил не я, а один из них, написали бы вы ему по-хранцусски? Или похвалили бы другана?
Я хотел, чтобы кто-то попытался отыскать ошибку самого алгоритма, а не придирался к ошибкам, которых по сути-то и нет.

Добавлено через 29 минут
А касательно этого:
Цитата Сообщение от D1973 Посмотреть сообщение
Если хотите поделиться - да ради бога, только делиться надо рабочим кодом, а не таким, к которому потом поправки идут с намеками "кому надо, тот разберется"
то напомню, что я спрашивал:
Цитата Сообщение от Vladimus Посмотреть сообщение
Подскажите, как вычислить количество дней в месяце по дате: 01.02.2020 (эта дата находится в Edit3.Text).
Цитата Сообщение от D1973 Посмотреть сообщение
DayCount := DayOfTheMonth(StrToDate(Edit3.Text));
Цитата Сообщение от Vladimus Посмотреть сообщение
Нет, не текущий день вывести надо, а количество дней в текущем месяце
Цитата Сообщение от D1973 Посмотреть сообщение
Да, блин, ну конечно же!!! Думаю одно - пишу другое...
Вы выдали код, который даже не удосужились проверить.
Так что не надо в чужих глазах соринки искать.

Добавлено через 55 минут
Хоть я тогда просил не вычисление текущего дня месяца, но этот код мне тоже очень пригодился, так что - спасибо.
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
08.12.2019, 10:32
Цитата Сообщение от Vladimus Посмотреть сообщение
у вас здесь на форуме, наверное, есть друзья?
Хочу заметить, что это тематический форум, а не соц.сеть... Абсолютно ничего личного, но если код неработоспособен, то... На это, собственно, и указываю, не более того... Точно так же, как и любой вправе указать мне на ошибку в моем коде, как это сделал mr-Crocodile... И уж смею Вас уверить, что это указание будет мною воспринято с благодарностью, безо всякого негатива и неадеквата, что, к сожалению, на этом форуме частенько случается...
Цитата Сообщение от Vladimus Посмотреть сообщение
а не придирался к ошибкам, которых по сути-то и нет.
А все-таки их тут достаточно много...

1. Не все то, что кажется очевидным Вам, будет столь же очевидно другому пользователю... Вот я увидел Вашу программу: я вижу кнопку, которую можно нажать, я ее нажимаю - получаю ошибку. И тот факт, что эту ошибку Вы отловили и сообщили о ней более внятно, чем это делает система, не изменяет странность ситуации: зачем разрешать нажимать на кнопку до получения всех входных данных от пользователя?
С другой стороны, что мешает сразу, при старте программы, инициировать начальное и конечное значение даты? Инициализировали текущей датой - и сразу отпадает необходимость в одной из проверок.

2. Когда я открыл программу - я увидел 2 календаря, 2 Эдита и кнопку... Про кнопку я уже написал, хотя это было второе, что я сделал в Вашей программе. Первое же, что я сделал - попытался ввести дату в поле ввода и был неприятно удивлен, когда у меня это не получилось... Скажите, зачем использовать поле ввода, но запрещать туда что-то вводить? Опытным путем я догадался, что туда будет заноситься выбранная в календаре дата... Помилуйте, но к чему тогда Эдит? Почему нельзя использовать Label или StaticText? Сразу бы, во-первых, отпал вопрос о причинах невозможности ввода, во-вторых - и мысли бы о вводе не возникло: т.к. вводить некуда, то, значит и не надо! и, в-третьих, код сокращается на 2 обработчика событий (а, кстати, почему 2? Тут прямо напрашивается один обработчик, присвоенный нескольким компонентам?)

3. Более того, зачастую гораздо быстрее ввести дату именно вручную, чем листать календарь, выбирая какой-нибудь тышша восемьсот лохматый год... Вот тут бы событие OnKeyPress было бы оправданно и пригодилось бы для проверки ввода только цифр и символа-разделителя...

4. Дата у Вас выбирается в календаре... Скажите, какой сакральный смысл получить дату, перевести ее в строку, вывести строку в Эдит (до этого момента весь процесс поддается логическому объяснению, несмотря на спорность выбора компонента Эдит в качестве... Ну, говорил уже об этом)... Но вот потом... Зачем обратно преобразовывать из строки в дату? Почему нельзя использовать уже полученные значения дат? Мало того, что этот шаг ненужен и нелогичен, так кроме этого на любое преобразование типов тратится время (пусть и микроскопически малое)...

5.
Цитата Сообщение от Vladimus Посмотреть сообщение
Начальная дата не должна быть равна Конечной дате или превышать ее
Позвольте поинтересоваться, а почему? Ось времени - такая же ось, как и любая другая в декартовой системе координат и двигаться по ней можно как вперед, так и назад... И какая разница, будет ли начальная дата 08.12.2019, а конечная 10.12.2019 или наоборот - разница, все одно, 2 дня...

6. В определении правильного наименования в годах Вы пошли по пути наименьшего сопротивления - простым перечислением... Но что получится, если разница будет более чем 101 год?

Можно продолжить, но что-то надоело... Надеюсь, Вы воспримите критику адекватно, без обвинений в кумовстве, предвзятом отношении и оскорблениях достоинства... Ну а нет, так нет, дело сугубо личное
1
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
08.12.2019, 11:15  [ТС]
Эта программка просто одна функция от другой программы, просто для наглядности я ее оформил так. Теперь я уже встроил этот алгоритм в другую программу и получил нужный результат. Я не хочу говорить, что я там делаю, это личное и вряд ли кому будет интересно, но 101 год это намного больше чем нужно.
Я тут думаю, может быть, Edit'ы с датами и правда заменить на те же Label... пока не знаю. В первоначальном варианте даты так и вводились - в Edit'ы, но потом я добавил календари и мне это понравилось. Мне не нужно выбирать большие промежутки времени, так что календари для выбора вполне удобны.
По условиям задачи "Начальная дата не должна быть равна Конечной дате или превышать ее" и это действительно так.
Пользователем моей программки буду только я, так что просто делаю ее под себя.
Причешу ее конечно окончательно, но эти все, вполне возможно лишние, преобразования при выполнении программы на ПК не имеют никакого значения, результат появляется мгновенно, так что...
Меня в первую очередь интересовал подсчет количества лет, месяцев и дней между двумя датами, и я хотел узнать - считает-то правильно? Я попробовал всевозможные сочетания дат и ошибки не нашел. В RichEdit1 для наглядности выводится своеобразный лог, по которому можно судить, как происходит расчет.

Добавлено через 10 минут
А, если учесть, что последний раз я пользовался Delphi в 2008 году, то тот факт, что за пару дней я решил эту задачку вызывает во мне чувство гордости.
Даже за один день, первый я потратил на другой способ подсчета, запутался окончательно из-за разного кол-ва дней в месяцах и високосном году, плюнул и сделал по-другому.
0
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,462
08.12.2019, 11:50
Цитата Сообщение от Vladimus Посмотреть сообщение
Если интересно - полюбопытствуйте.
Странный метод запрещения ввода. Почему бы не сделать Edit3.Enabled := false;? Ну разве что, в этом случае скопировать из поля не получается.

Почему бы не использовать готовый компонент DateTimePicker? Он и дату в готовом нормальном виде всегда выдаёт, и с клавиатуры можно вводить, и календарь открывается, когда нужно.
1
1 / 1 / 0
Регистрация: 05.08.2011
Сообщений: 153
08.12.2019, 11:58  [ТС]
Вот, если бы я о нем знал, то обязательно бы использовал.
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
08.12.2019, 12:09
Цитата Сообщение от Vladimus Посмотреть сообщение
но потом я добавил календари и мне это понравилось
Попробуйте добавить DateTimePicker - там можно либо из календаря дату выбирать, а можно и руками писать. И места на экране меньше занимает.
Цитата Сообщение от Vladimus Посмотреть сообщение
Эта программка просто одна функция от другой программы
Ну так и делайте ее функцией, так, как ниже к примеру... Тут же заодно и функция определения правильной формы слова: день-дня-дней, месяц-месяца-месяцев, год-года-лет...
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
function GetWord(X: Word; Flag: byte): String;
begin
  if (X mod 100 in [11..14]) or (X mod 10 = 0) or (X mod 10 > 4) then
    case Flag of
      0 : result := 'лет';
      1 : result := 'месяцев';
      2 : result := 'дней';
    end
  else
    if X mod 10 = 1 then
      case Flag of
        0 : result := 'год';
        1 : result := 'месяц';
        2 : result := 'день';
      end
    else
      case Flag of
        0 : result := 'года';
        1 : result := 'месяца';
        2 : result := 'дня';
      end;
end;
 
function GetLongInterval(D1, D2: TDate): String;
var Y, M, D: Word;
begin
  Y := YearsBetween(D1, D2);
  if D1 > D2
    then D2 := IncYear(D2, Y) else D1 := IncYear(D1, Y);
  M := MonthsBetween(D1, D2);
  if D1 > D2 then D2 := IncMonth(D2, M) else D1 := IncMonth(D1, M);
  D := DaysBetween(D1, D2);
  result := Format('%d %s %d %s %d %s', [Y, GetWord(Y, 0), M, GetWord(M, 1), D,  GetWord(D, 2)]);
end;
Пример вызова и результат:
Delphi
1
2
3
4
procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage(GetLongInterval(DateTimePicker1.Date, DateTimePicker2.Date));
end;
Миниатюры
Как вычислить кол-во дней между двумя датами и перевести в кол-во лет, мес. дней?  
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2019, 12:09
Помогаю со студенческими работами здесь

вычислить кол-во дней между датами
Даны a1,b1,c1, и a2,b2,c2 которые обозначают две даты. Нужно вычислить кол-во дней между этими датами

Запрос к БД Acces для расчета кол-ва лет и кол-ва дней до ДР
Добрый день! Очень нужна помощь! Есть БД в Access: простенькая табличка: ФИО, День рождения В делфи пишу прогу. На форме в таблицу...

Вычислить количество дней и количество полных лет между двумя датами
Ввести натуральные числа а(1), b(1), c(1), a(2), b(2), c(2), которые указывают две даты (число, месяц, год). Вычислить: а) количество...

Кол-во дней между датами в двух ячейках, в месяцах и днях
Есть две даты, например 12-Янв-2005 и 25-Июн-2005. Подскажите можно ли составить формулу, чтобы в первой ячейке показывало сколько...

Нахождение дней между диапазоном дат(не кол-во дней, а сами дни)
Всем привет, возникла такая задачка: есть начальная и конечная даты, нужно найти дни между ними, не само кол-во дней, а именно сами дни,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
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