|
Вопрос # 144/ вопрос открыт / |
|
Есть начальная и конечная дата периода.
Как написать оператор цыкла так, чтобы он начинался с
начальной даты и перебырал каждый день до конечной даты? Тоисть, количество цыклов должно равняться количиству дней в указаном перыоде. При этом вкаждом цыкле нужно читать дату с которой он работает.
 |
Вопрос задал: Игорь Середюк (статус: Посетитель)
Вопрос отправлен: 26 октября 2006, 13:34
Состояние вопроса: открыт, ответов: 4.
|
Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович
Здравствуйте, Игорь Середюк!
Дата предствляется типом DateTime, который есть не что иное как real, причем целая часть - дни, дробная - время. Таким образом взяв целую часть од начальной даты и от конечной Вы получите числа по которым можно организовать цикл, а внутри цикла преобразовав обратно получите дату каждого конкретного дня.
Приложение: Переключить в обычный режим- var
- StartDate,EndDate,Today:TDatetime;
- i:LongInt;
- y,m,d:Word;
- for i:=trunc(StartDate) to trunc(EndDate) doo begin
- Today:=i;
- DecodeDate(Today,y,m,d);
- ...........
- end
Ответ #2. Отвечает эксперт: min@y™
В модуле DateUtils.pas есть много интересных функций для работы с датами и временем. Для вычисления кол-ва дней между двумя датами (т.е. кол-во итераций цикла) используй функцию:
function DaysBetween(const ANow, AThen: TDateTime): Integer;
Для получения текущей даты юзай функцию Date().
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 27 октября 2006, 08:16
Оценка за ответ: 4
|
Ответ #3. Отвечает эксперт: Новаковский Юрий Аврамович
Самое простое узнать номер юлианского дня для второй даты и вычесть из него номер юлианского дня для первой даты даты.
Юлианские дни - число дней с полудня 1 января 4713 до н. э. по юлианскому календарю
служат для расчета числа дней между двумя датами . Есть соответствующие формулы и таблицы, найти их можно в астрономическх календарях (см.приложение).Вычисляет верно, но без учета времени суток.
Удачи Вам.
Приложение: Переключить в обычный режим-
-
- jd := ( 1461 * ( y + 4800 + ( m - 14 ) / 12)) / 4 +
- ( 367 * ( m - 2 - 12 * (( m - 14 ) / 12))) / 12 -
- 3 * ((( y + 4900 + ( m - 14 ) / 12) / 100) / 4) +
- d - 32075;
-
-
-
-
-
Ответ #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 (статус: Студент), 26 октября 2006, 15:21 [#1]:
Игорь Середюк: м-да... ну и грамотность у вас...
С уважением.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|