![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще один вопрос о времени...
angelcom © (2002-08-08 19:53:00)Если расчитывать разницу между двумя датами и временем:
напр: 23.05.02 08:00 и 29.05.02 12:00 то результат выдает 147:59
мне такой результат не подходит, необходимо 148:00 и т.д. если пробывать разные интервалы времени, выпадает 29 мин и т.д.
Как избавится от этой оплошности???
angelcom (2002-08-13 03:40:00) [1]В функции elv © есть маленькая недоработка, я ее устранил. теперь все ОК, спасибо всем кто откликнулся
lgreg (2002-08-12 22:13:00) [2]FromTime:=TimeStampToMSecs(DateTimeToTimeStamp(FStartTime));
ToTime:= TimeStampToMSecs(DateTimeToTimeStamp(FEndTime));
E:=ToTime-FromTime;
e := e / 1000;
Trunc(E); //-- секунды
e := e / 60;
Truncate(E); //--минуты и т.д.
FStartTime это:StrToDateTime(DateToStr(DateTimePicker2.Date)+" "+MaskEdit2.Text)
вкратце, так.
работает.
elv (2002-08-12 17:38:00) [3]pasha676
Все вроде нормально работает.
Выполни авторский код.
pasha676 (2002-08-12 16:08:00) [4]Мужики а я не понял в чем проблемма то.
Вот у меня прога работающая, отрывок из нее:
EndTime:=NOw-BeginTime; - Тут все TDateTime
DecodeTime(EndTime,Hour, Min, Sec, MSec);
Все вроде нормально работает. Или когда дата появляется начинаються сбои?
Anatoly Podgoretsky (2002-08-12 10:23:00) [5]А почему бы не перевести время в минуты (24*60) с простым округлением и в дальнейшем пользовать обычным целочисленным делением и остатком по модулю 60
elv (2002-08-12 10:17:00) [6]Johnmen
Ага. Кстати из какого то faq.
angelcom
function RoundUp( X: Extended; Y:Integer): Extended;
begin
x:=x*y;
X:= Trunc(X) + Trunc (Frac(X) * 2);
RoundUp:=X/y;
end;
Johnmen (2002-08-12 09:32:00) [7]>elv © (10.08.02 13:56)
Невполне корректная процедура округления...
angelcom (2002-08-12 03:35:00) [8]Вы супер мастера, огромное спасибо
elv (2002-08-10 13:56:00) [9]Ну ты и извращенец ;)
{---------------------------------------------------------}
Function MyRound( X: Double; Precision : Integer ): Double;
var
ScaledFractPart, Temp : Double;
begin
ScaledFractPart := Frac(X)*Precision;
Temp := Frac(ScaledFractPart);
ScaledFractPart := Int(ScaledFractPart);
if Temp >= 0.5 then ScaledFractPart := ScaledFractPart + 1;
if Temp <= -0.5 then ScaledFractPart := ScaledFractPart - 1;
MyRound := Int(X) + ScaledFractPart/Precision;
end; //MyRound
{---------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
ddiff:TDateTime;
begin
ddiff:=StrToDateTime(DateToStr(DateTimePicker2.Date)+" "+MaskEdit2.Text)-StrToDateTime(DateToStr(DateTimePicker1.Date)+" "+MaskEdit1.Text);
ddiff:=MyRound(ddiff,10000);
Lab_All_Time.Caption := IntToStr(trunc(ddiff*24)) + ":" + IntToStr(trunc(frac(ddiff*24)*60));
angelcom (2002-08-10 05:59:00) [10]Я делаю следующее:
var
ddiff:TDateTime;
begin
...
ddiff:=StrToDateTime(DateToStr(DateTimePicker2.Date)+" "+MaskEdit2.Text)-StrToDateTime(DateToStr(DateTimePicker1.Date)+" "+MaskEdit1.Text);
Lab_All_Time.Caption := IntToStr(trunc(ddiff*24)) + ":" + IntToStr(trunc(frac(ddiff*24)*60));
...
end;
Anatoly Podgoretsky (2002-08-08 20:56:00) [11]Ты не пишешь, как производишь вычисления, но это обычная проблема относительности представлений чисел с плавующией запятой.
У тебя 6 дней и 8 часов, 8 часов это 1/6, дальше тебе наверно все понятно, в своих вычислениях примени округление
elv (2002-08-08 20:41:00) [12]StrToDateTime("29.05.02 12:00")-StrToDateTime("23.05.02 08:00")=6.1666666667
Не понятно что ты хочешь. Также непонятно что тебе нужно на самом деле. :)