Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.035 c
4-1084459297
Игорь Н.
2004-05-13 18:41
2004.06.20
Как вызвать окно внимание (attention)?


1-1086764794
AleXqwq
2004-06-09 11:06
2004.06.20
Create Help


3-1085494091
Tom
2004-05-25 18:08
2004.06.20
TADOQuery.LoadFromFile


1-1086603373
Mameluke
2004-06-07 14:16
2004.06.20
Работа с MS Excel


6-1083427050
arp
2004-05-01 19:57
2004.06.20
Оптимизация сканирования локальной сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский