Смятане със TTimeStamp?

4 отговора 0 прегледа
#1

Смятане със TTimeStamp?

Имам проблеми с точността на TDateTime (бърка с цяла минута), затова реших да ползвам TTimeStamp. Отдавна не съм писал на C++ Builder (ползвам версия 6) и съм забравил как се прави. Може ли малко помощ?

Целта ми е да се сметне разликата меджу 2 TDateTime стойности и да се сравни с друга TDateTimе стойност. Преобразувам TDateTime стойностите във ТTimeStamp чрез функцията DateTimeToTimeStamp, а после във Comp (която е някаква нестандартна структура, а не прост тип данни) чрез TimeStampToMSecs. Но после имам проблеми със следния ред код:
if(dtMSec-lastMSec>=diffMSec)
компилатора дава грешка на този ред.
Всички променливи в този ред са от тип Comp.
Грешката е [C++ Error] seans.cpp(270): E2015 Ambiguity between '_fastcall System::operator -(double,const Currency &)' and 'Comp::operator double() const'

Какво да направя за да мога да изчисля разликата между 2-те Comp стойности и да я сравня с 3-тата Comp стойност, и да работи правилно?


Редактирано от naki на

Отговор
в отговор на naki #2

Re: Смятане със TTimeStamp?

Ти сигурен ли си, че TDateTime бърка с цяла минута? Да не е нещо друго?
TDateTime всъщност е double, където 1 = 1 ден, т.е. 1 мин = 1/(24*60) = около 0.0007. Заедно с дните, които са 5-цифрени за днешни дати, това прави 9 цифри. Double би трябвало да се оправя без проблем с изваждане на числа от един и същи порядък с много по-голяма точност. Самият тип има точност 16-17 цифри.

За Comp може да пробваш да ги cast-неш към Int64 - Comp си е точно това, нищо че е класифициран при реалните типове. Друг е въпросът, че се поддържа само за backward compatibility.

Редактирано от Formal на

Отговор
в отговор на Formal #3

Re: Смятане със TTimeStamp?

Бърка при изваждане. Тоест date1-date2>=EncodeTime(0,5,0,0) дава резултат ту 6 минути, ту 5 минути.

Оправих проблема, ето крайния код:

TTimeStamp myDiff,diffStamp;
diffStamp=DateTimeToTimeStamp(EncodeTime(Hours,Mins,0,0)); <---това е периода, с който се сравнява
myDiff=DateTimeToTimeStamp(dt-frmMain->lastUpdate);

unsigned __int64 myDiffNum,diffNum; <---- Избягваме ползването на Comp
myDiffNum=myDiff.Date*24*60*60*1000+myDiff.Time; <--- брой милисекунди
diffNum=diffStamp.Date*24*60*60*1000+diffStamp.Time;

if(myDiffNum>=diffNum)



Отговор
в отговор на naki #4

Re: Смятане със TTimeStamp?

Щом имаш решение добре, ама не ми се вярва изваждането на две дати да бърка с 1 минута.
Смятъм че (date1 - date2) * 24 * 60 >= 5 ще свърши по- добра работа от онези 7 реда. Винаги по тизи начин смятъм периоди от време. До сега не съм имал проблеми.

Отговор
в отговор на naki #5

Re: Смятане със TTimeStamp?

naki, нали знаеш, че в Буилдера има винаги още едно възможно решение - да използваш стандартната С библиотека и ф-иите gettime(), settime(), difftime() ако точноста на разликата м/у двете времена е до секунда.


... for a brief moment it seemed that rock 'n roll would inherit the earth.
Отговор