Форум: "Потрепаться";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизКолличество дней между двумя датами. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c