Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 12

Определение количества календарных дней с разбиением на 30, 31, 28 и 29

21.09.2016, 13:08. Показов 1795. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Ребят, требуется помощь. Имеется 2 дататаймпикера и кнопка. Соответственно, после нажатия кнопки, необходимо вывести на экран количество дней в месяцах с 31 днем, дней в месяцах с 30 днями и т.д.

Пример:

Период с 01/01/16 00:00:00 по 05/04/16 00:00:00
Дней в месяцах с 31 днем - 62 дня
Дней в месяцах с 30 днем - 4 дня
Дней в месяцах с 28 днем - 0 дней
Дней в месяцах с 29 днем - 29 дней

Сам итоговой вывод не имеет значения: можно с разбиением по месяцам или как в примере ранее.

Подтолкните на верный курс.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2016, 13:08
Ответы с готовыми решениями:

7+7 календарных дней
Добрый день. Подскажите, пожалуйста, как реализовать такое вот условие: есть поле в форме, в котором указывается дата (например: Data) ...

Определение количества дней недели в году
Всем категорический привет и наилучшие пожелания в наступающем 2018!!! Имею вопрос: как определить количество дней недели...

выборка и расчет календарных дней.
Доброго времени суток.Совсем недавно взялся за access2k7(ранее не занимался им вообще) просто для общего развития,но чтобы быстрее научится...

28
6002 / 4577 / 1096
Регистрация: 29.08.2013
Сообщений: 28,266
Записей в блоге: 3
22.09.2016, 13:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Xavii Посмотреть сообщение
не умею с функциями работать
да что с ними работать? функция требует параметр - в вашем случае год и месяц и возвращает число

что сложного?
1
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
22.09.2016, 13:26
Delphi
1
while (m1<>m2) OR (y1<>y2) do
Перевожу на русский:
Пока месяц1 не равен месяцу2 или год1 не равен году 2 делать
1
6002 / 4577 / 1096
Регистрация: 29.08.2013
Сообщений: 28,266
Записей в блоге: 3
22.09.2016, 13:45
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
function MonthBetween(const date1,date2:TDateTime):integer;
var
  d1,m1,y1: word;
  d2,m2,y2: word;
begin
  decodedate(date1,y1,m1,d1);
  decodedate(date2,y2,m2,d2);
  result:=(m2-m1)+(y2-y1)*12;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var  i:integer;
    d1,m1,y1, // первая дата
    d2,m2,y2, // вторая дата
    m,y,         // промежуточная дата
    c28,c29,c30,c31:word; // вывод итога
begin
  decodedate(DateTimePicker2.Date,y2,m2,d2);
  decodedate(DateTimePicker1.Date,y1,m1,d1);
  c28:=0;
  c29:=0;
  c30:=0;
  c31:=0;
  y:=y1;
  for I := 0 to MonthBetween(DateTimePicker1.Date, DateTimePicker2.date) do
  begin
    m:=m1+i;
    if (m mod 13)=0 then // если вышли за пределы года
    begin
      m:=1;
      y:=y+1;
    end;
    case DaysInAMonth(y,m) of
    28:c28:=c28+1;
    29:c29:=c29+1;
    30:c30:=c30+1;
    31:c31:=c31+1;
    end;
 
  end;
  Memo1.Lines.Add('28: '+inttostr(c28));
  Memo1.Lines.Add('29: '+inttostr(c29));
  Memo1.Lines.Add('30: '+inttostr(c30));
  Memo1.Lines.Add('31: '+inttostr(c31));
end;
1
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 12
22.09.2016, 14:46  [ТС]
В итоге получился вот такой полностью рабочий код:
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
procedure TForm1.btn1Click(Sender: TObject);
var days, d1, m1, y1, d2, m2, y2, c28, c29, c30, c31: integer;
begin
 
  days:=DaysBetween(dtp1.date, dtp2.date);
  btn1.Caption:=IntToStr(Days);
 
  d1:=DayOf(dtp1.Date);
  m1:=MonthOf(dtp1.Date);
  y1:=YearOf(dtp1.Date);
  d2:=DayOf(dtp2.Date);
  m2:=MonthOf(dtp2.Date);
  y2:=YearOf(dtp2.Date);
 
  c28:=0;
  c29:=0;
  c30:=0;
  c31:=0;
 
  //промежуточные месяца
  begin
    while (m1<>m2) or (y1<>y2) do
    begin
      case m1 of
      1 :   c31:= c31+31;
      2 :   if y1 mod 4 = 0 then c29:= c29+29
            else c28:= c28+28;
      3 :   c31:= c31+31;
      4 :   c30:= c30+30;
      5 :   c31:= c31+31;
      6 :   c30:= c30+30;
      7 :   c31:= c31+31;
      8 :   c31:= c31+31;
      9 :   c30:= c30+30;
      10 :  c31:= c31+31;
      11 :  c30:= c30+30;
      12 :  c31:= c31+31;
      end;
 
      if m1=12 then
        begin
        m1:=1;
        y1:=y1+1
        end
      else
        m1:=m1+1;
    end;
  end;
 
 
  //последний месяц
  begin
      case m2 of
      1 :   c31:= c31+(d2-1);
      2 :   if y1 mod 4 = 0 then c29:= c29+(d2-1)
            else c28:= c28+(d2-1);
      3 :   c31:= c31+(d2-1);
      4 :   c30:= c30+(d2-1);
      5 :   c31:= c31+(d2-1);
      6 :   c30:= c30+(d2-1);
      7 :   c31:= c31+(d2-1);
      8 :   c31:= c31+(d2-1);
      9 :   c30:= c30+(d2-1);
      10 :  c31:= c31+(d2-1);
      11 :  c30:= c30+(d2-1);
      12 :  c31:= c31+(d2-1);
      end;
  end;
 
 
  //первый месяц
  m1:=MonthOf(dtp1.Date);
  begin
      case m1 of
      1 :   c31:= c31-(d1-1);
      2 :   if y1 mod 4 = 0 then c29:= c29-(d1-1)
            else c28:= c28-(d1-1);
      3 :   c31:= c31-(d1-1);
      4 :   c30:= c30-(d1-1);
      5 :   c31:= c31-(d1-1);
      6 :   c30:= c30-(d1-1);
      7 :   c31:= c31-(d1-1);
      8 :   c31:= c31-(d1-1);
      9 :   c30:= c30-(d1-1);
      10 :  c31:= c31-(d1-1);
      11 :  c30:= c30-(d1-1);
      12 :  c31:= c31-(d1-1);
      end;
  end;
 
  lbl28.Caption:=('28 д - '+IntToStr(c28));
  lbl29.Caption:=('29 д - '+IntToStr(c29));
  lbl30.Caption:=('30 д - '+IntToStr(c30));
  lbl31.Caption:=('31 д - '+IntToStr(c31));
end;
Огромное спасибо за помощь и наводки.
Но все же не понял почему нужно использовать OR вместо AND. Буду разбираться
0
6002 / 4577 / 1096
Регистрация: 29.08.2013
Сообщений: 28,266
Записей в блоге: 3
22.09.2016, 14:48
Цитата Сообщение от Xavii Посмотреть сообщение
вот такой полностью рабочий код:
ужас

ты что не знаешь что в case можно делать так
Delphi
1
2
3
4
5
6
7
8
m1:=MonthOf(dtp1.Date);
  begin
      case m1 of
        1,3,5,7,8,10,12 :   c31:= c31-(d1-1);
        2 :   if y1 mod 4 = 0 then c29:= c29-(d1-1) else c28:= c28-(d1-1);
        4,6,9,11 :   c30:= c30-(d1-1);
      end;
  end;
посмотри мой вариант
1
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 12
22.09.2016, 14:50  [ТС]
northener, вот именно что ИЛИ, а не на полное совпадение условий. Ладно, спорить не буду - на досуге разберусь.

Добавлено через 47 секунд
qwertehok, спасибо, исправил.
0
60 / 60 / 26
Регистрация: 30.05.2016
Сообщений: 293
22.09.2016, 15:29
работает вроде нормально
Вложения
Тип файла: zip дни.zip (5.5 Кб, 2 просмотров)
0
Эксперт Pascal/Delphi
 Аватар для droider
4893 / 2826 / 867
Регистрация: 04.10.2012
Сообщений: 10,278
22.09.2016, 15:40
qwertehok, функция MonthsBetween() присутствует в модуле DateUtils
0
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
23.09.2016, 21:31
Извиняюсь что долго не отвечал работы много, все таки код который давл ранее работает, там где 28 дней и 29.
Можете сами проверить.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  i:integer;
begin
  for I := 2000 to 2016 do begin
    DT1.DateTime := StrToDate('31.01.'+inttostr(i));
    DT2.DateTime := StrToDate('02.03.'+inttostr(i));
    d1:=DateTimeToUnix(DT1.DateTime);
    d2:=DateTimeToUnix(DT2.DateTime);
    Memo1.Lines.Add(DateToStr(DT1.DateTime));
    Memo1.Lines.Add(DateToStr(DT2.DateTime));
    Memo1.Lines.Add(SecondsToString(d2-d1).Date);
    Memo1.Lines.Add('----------------------------');
  end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2016, 21:31

Определение количества дней между двумя датами
Программа получает на вход две строки, содержащие даты, записанные в формате dd.mm.yyyy, где dd – день месяца от 01 до 31, mm – номер...

Определение количества дней между двумя датами!
Здравствуйте! помогите написать программу определяющую количество дней между двумя датами! Но с одним условием написать с использованием...

Определение количества дней между двумя датами
в году 12 месяцев,один месяц - 60дней нужно вычислить кол-во дней отпуска даются две строки в формате 21.01.2017 22.01.2017 ...

Определение количества дней, оставшееся до наступления дня программиста
Существует день программиста, который отмечается ежегодно в 256 день года. Друзья решили посчитать, через сколько дней наступит следующий...

Определение количества дней, прошедших с даты, вводимой с клавиатуры
Организовать в программе определение количества дней прошедших с даты, вводимой с клавиатуры. Организовать ввод через форму имени...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru