Главная страница
    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.046 c
1-1086675034
Yurec66
2004-06-08 10:10
2004.06.20
Затирание экрана движущимся объектом


1-1086233758
rtf
2004-06-03 07:35
2004.06.20
Как узнать количество дней между двумя датами?


3-1085827922
Denis_Visma
2004-05-29 14:52
2004.06.20
Вопрос по нескольким ДатаСеиам и одной транзакции


14-1086019222
praktika
2004-05-31 20:00
2004.06.20
! ПОМОГИ СТУДЕНТУ ПРОЙТИ ПРАКТИКУ !


3-1084490911
Олеся
2004-05-14 03:28
2004.06.20
Java+Interbase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский