Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 144

/ вопрос открыт /

Есть начальная и конечная дата периода.
Как написать оператор цыкла так, чтобы он начинался с
начальной даты и перебырал каждый день до конечной даты? Тоисть, количество цыклов должно равняться количиству дней в указаном перыоде. При этом вкаждом цыкле нужно читать дату с которой он работает.

Игорь Середюк Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Игорь Середюк (статус: Посетитель)
Вопрос отправлен: 26 октября 2006, 13:34
Состояние вопроса: открыт, ответов: 4.

Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, Игорь Середюк!
Дата предствляется типом DateTime, который есть не что иное как real, причем целая часть - дни, дробная - время. Таким образом взяв целую часть од начальной даты и от конечной Вы получите числа по которым можно организовать цикл, а внутри цикла преобразовав обратно получите дату каждого конкретного дня.

Приложение:
  1. var
  2. StartDate,EndDate,Today:TDatetime;
  3. i:LongInt;
  4. y,m,d:Word;
  5. for i:=trunc(StartDate) to trunc(EndDate) doo begin
  6. Today:=i;
  7. DecodeDate(Today,y,m,d);
  8. ...........
  9. end


Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 26 октября 2006, 13:49

Ответ #2. Отвечает эксперт: min@y™

В модуле DateUtils.pas есть много интересных функций для работы с датами и временем. Для вычисления кол-ва дней между двумя датами (т.е. кол-во итераций цикла) используй функцию:

function DaysBetween(const ANow, AThen: TDateTime): Integer;

Для получения текущей даты юзай функцию Date().

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 27 октября 2006, 08:16
Оценка за ответ: 4

Ответ #3. Отвечает эксперт: Новаковский Юрий Аврамович

Самое простое узнать номер юлианского дня для второй даты и вычесть из него номер юлианского дня для первой даты даты.
Юлианские дни - число дней с полудня 1 января 4713 до н. э. по юлианскому календарю
служат для расчета числа дней между двумя датами . Есть соответствующие формулы и таблицы, найти их можно в астрономическх календарях (см.приложение).Вычисляет верно, но без учета времени суток.
Удачи Вам.

Приложение:
  1.  
  2.  
  3. jd := ( 1461 * ( y + 4800 + ( m - 14 ) / 12)) / 4 +
  4. ( 367 * ( m - 2 - 12 * (( m - 14 ) / 12))) / 12 -
  5. 3 * ((( y + 4900 + ( m - 14 ) / 12) / 100) / 4) +
  6. d - 32075;
  7.  
  8.  
  9.  
  10.  
  11.  


Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 27 октября 2006, 15:22
Оценка за ответ: 5

Ответ #4. Отвечает эксперт: sattar

var
Month1,Month2,Year1,Year2,Day1,Day2:Integer;
Month,Day,Year:Integer;

Function CaseMonth(Month:integer):integer;
begin
case Month of
1,3,5,7,8,10,12:Result:=31;
4,6,9,11:Result:=30;
2: Result:=28;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Day1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),1,2));
Month1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),4,2));
Month2:=12;
Year1:=StrToInt(Copy(DateToStr(DateTimePicker1.Date),7,4));
Year2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),7,4));
For Year:=Year1 to Year2 do begin
if Year=Year2 then Month2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),4,2));
For Month:= Month1 to Month2 do
begin
if Month=12 then day2:=31 else
begin
Day2:=CaseMonth(Month);
if Month=Month2 then Day2:=StrToInt(Copy(DateToStr(DateTimePicker2.Date),1,2));
end;
For Day:=Day1 to Day2 do
Memo1.Lines.Add(IntToStr(Day)+' '+IntToStr(Month)+' '+IntToStr(Year));
Day1:=1;
end;
Month1:=1;
end;
end;

Ответ отправил: sattar (статус: 2-ой класс)
Время отправки: 27 октября 2006, 21:54


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 26 октября 2006, 15:21; участников в обсуждении: 1.
Dron

Dron (статус: Студент), 26 октября 2006, 15:21 [#1]:

Игорь Середюк: м-да... ну и грамотность у вас...
С уважением.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.03 сек.