Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Колличество дней между двумя датами.   Найти похожие ветки 

 
Igorek ©   (2004-06-03 12:07) [0]

Поиск в сети по проблеме ничего толкового не дал.
Вот такой простой код не дает ожидаемого результата:

function TTrialProtector.DaysBetweenDates(const Date1,
 Date2: TDateTime): Integer;
var
 D1, D2: TDateTime;//отладочные переменные
 Year, Month, Day: Word;
begin
 D1 := Date;
 D2 := Date;
 DecodeDate(Abs(D2 - D1), Year, Month, Day);//здесь странность
//  DecodeDate(Abs(Date2 - Date1), Year, Month, Day);
 Result := Day;
end;

Зарывшись в ВЦЛ вышел на две функции:

procedure DivMod(Dividend: Integer; Divisor: Word;
 var Result, Remainder: Word);
asm
       PUSH    EBX
       MOV     EBX,EDX
       MOV     EDX,EAX
       SHR     EDX,16
       DIV     BX
       MOV     EBX,Remainder
       MOV     [ECX],AX
       MOV     [EBX],DX
       POP     EBX
end;

procedure InternalDecodeDate(Date: TDateTime; var Year, Month, Day, DOW: Word);
const
 D1 = 365;
 D4 = D1 * 4 + 1;
 D100 = D4 * 25 - 1;
 D400 = D100 * 4 + 1;
var
 Y, M, D, I: Word;
 T: Integer;
 DayTable: PDayTable;
begin
 T := DateTimeToTimeStamp(Date).Date;
 if T <= 0 then
 begin
   Year := 0;
   Month := 0;
   Day := 0;
   DOW := 0;
 end else
 begin
   DOW := T mod 7;
   Dec(T);
   Y := 1;
   while T >= D400 do
   begin
     Dec(T, D400);
     Inc(Y, 400);
   end;
   DivMod(T, D100, I, D);
   if I = 4 then
   begin
     Dec(I);
     Inc(D, D100);
   end;
   Inc(Y, I * 100);
   DivMod(D, D4, I, D);
   Inc(Y, I * 4);
   DivMod(D, D1, I, D);
   if I = 4 then
   begin
     Dec(I);
     Inc(D, D1);
   end;
   Inc(Y, I);
   DayTable := @MonthDays[IsLeapYear(Y)];
   M := 1;
   while True do
   begin
     I := DayTable^[M];
     if D < I then Break;
     Dec(D, I);
     Inc(M);
   end;
   Year := Y;
   Month := M;
   Day := D + 1;
 end;
end;

К сожалению я не знаток асма и не могу проанализировать.
Кто что посоветует?


 
Igorek ©   (2004-06-03 12:09) [1]

Подразумевается что период меньше месяца.


 
Романов Р.В. ©   (2004-06-03 12:14) [2]

Trunc(SecondDate)-Trunc(FirstDate)


 
McSimm ©   (2004-06-03 12:15) [3]

Могу посоветовать два варианта.

1) Result = Trunc(Date2-Date1);
2) Result = Trunc(Date2) - Trunc(Date1);

В зависимости от того требуется календарное количество дней либо суточное.


 
Sergey_Masloff   (2004-06-03 12:16) [4]

Ты не сказал в чем странность.
Разница между целыми частями TDateTime это ж и есть число дней - больше там месяца или меньше по барабану.


 
Igorek ©   (2004-06-03 12:18) [5]

Большое спасибо. Странно все же что ВЦЛ код неправильно работает. Или я что-то неправильно делаю.


 
Igorek ©   (2004-06-03 12:18) [6]


> Sergey_Masloff   (03.06.04 12:16) [4]
> Ты не сказал в чем странность.
> Разница между целыми частями TDateTime это ж и есть число
> дней - больше там месяца или меньше по барабану.

Странно, что приведенный код дает 30 дней.


 
McSimm ©   (2004-06-03 12:19) [7]


> Странно все же что ВЦЛ код неправильно работает.


:))))


 
Igorek ©   (2004-06-03 12:22) [8]

Все понял. Я баран.


 
Igorek ©   (2004-06-03 12:22) [9]

Удалено модератором
Примечание: Тра раза что ли :-)


 
Igorek ©   (2004-06-03 12:22) [10]

Удалено модератором
Примечание: Трипл


 
Liavik   (2004-06-03 12:31) [11]

Вот этот код проще

procedure TForm1.Button1Click(Sender: TObject);
var S, S2: TDateTime;
 S3:integer;
begin

S:=DateTimePicker1.Date;
S2:=DateTimePicker2.Date;
S3:=DaysBetween(S, S2);
Edit1.Text:=IntToStr(S3);
end;


все.


 
Igorek ©   (2004-06-03 12:33) [12]

Оснановился на:
function TTrialProtector.DaysBetweenDates(const Date1,
 Date2: TDateTime): Integer;
begin
 Result := Trunc(Abs(Date2 - Date1));
end;


 
Anatoly Podgoretsky ©   (2004-06-03 12:36) [13]

Liavik   (03.06.04 12:31) [11]
01.01.2004 00:00:00 - 02.01.2004 12:00:00
Правильные ответ 1 1,5 2


 
blackman ©   (2004-06-03 12:41) [14]

1 1,5 2 - Шифр ?


 
Романов Р.В. ©   (2004-06-03 12:48) [15]

суток


 
Liavik   (2004-06-03 12:58) [16]

>Колличество дней между двумя датами.

функция DaysBetween считает только целые дни котороые протекли.


 
Vovchik_A ©   (2004-06-03 13:33) [17]

2Liavik   (03.06.04 12:58) [16]
DaysBetween, если мне не изменяет память в 6-ом делфи появилась. Если он пишет на 5-ом, то твое решение не подходит.


 
Паниковский ©   (2004-06-03 14:15) [18]

D7
function Between(date1,date2:TDateTime):integer;
var
year,day:word;
return:integer;
begin
 DecodeDateDay(date1,year,day);
 return := day;
 DecodeDateDay(date1,year,day);
 return := return - day;
 Result := return;
end;


 
Anatoly Podgoretsky ©   (2004-06-03 16:24) [19]

Паниковский ©   (03.06.04 14:15) [18]
А посчитать между 31 и 1 не пробовал, не удивляйся если ответ будет 30 вместо 1



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
4-1084597907
Seldon
2004-05-15 09:11
2004.06.20
Кнопка на taskbar и Caption формы


3-1085662454
Silencer
2004-05-27 16:54
2004.06.20
RxDBGrid и ширина колонок


3-1085667512
DimonNew
2004-05-27 18:18
2004.06.20
Фильтр по измененным записям


3-1085718625
explorer
2004-05-28 08:30
2004.06.20
Работа с DataSource


14-1086394830
Феликс
2004-06-05 04:20
2004.06.20
Как же это дело сформулировать?