|
DateTime의 Val 값이 double 형인데요
이 값이 1이 하루를 나타내요
그래서 +1 하면 하루가 올라간 날짜가 되구요
그러면 1시간은 0.04167 이 아니라
정확히 1/24 즉 0.0416666666666666666666666666.... 이 됩니다.
하루 24시간 365일 이면 24*365 = 8760시간
0.04167 를 더하면서 8760루프를 돌려보면, 1년동안 42분 정도 오차가 생기네요
1/24.0 을 더하면서 1년동안 돌려서 1초도 오차가 나지 않습니다.
1/24.0 을 더하면서 한 500년 돌리니까 1초정도 오차가 나네요
그리고 또 DateUtils 라는 unit 에 DateTime관련 함수들이 있습니다.
IncHour를 통해 1시간 올릴면 됩니다.
그렇지만 IncHour 함수도 500년정도 돌리면 1/24.0을 더한것이나 마찬가지 결과가 나옵니다.
더 오차를 줄이려면 long double 변수를 선언해서 500년 계산을 해서 그 결과값을 더하면 됩니다.
그러면 수천년까지는 오차가 없네요
아니면 더해야할 시간을 24로 나누어 몪과 나머지를 분류하여 계산하면 아주아주 정학할것 같습니다.
#include "DateUtils.hpp"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TDateTime dt1=Now();
TDateTime dt2=dt1;
TDateTime dt3=dt1;
TDateTime dt4=dt1;
TDateTime dt5=dt1;
Label5->Caption=dt1.FormatString("yyyy-mm-dd hh:nn:ss"); // 현재시간
int roof=24*365*10000 + 5 ; // 1만년 + 5시간
long double dval=0;
int iday=roof/25;
int itime=roof%24;
for(int i=0;i<roof;i++)
{
dt1.Val=dt1.Val+0.04167 ;
dt2.Val=dt2.Val+1/24.0 ;
dt3=IncHour(dt3,1);
dval=dval+1/24.0;
}
dt4.Val=dt4.Val+dval;
Label6->Caption=dt1.FormatString("yyyy-mm-dd hh:nn:ss"); // 방법1
Label7->Caption=dt2.FormatString("yyyy-mm-dd hh:nn:ss"); // 방법2
Label8->Caption=dt3.FormatString("yyyy-mm-dd hh:nn:ss"); // 방법3
Label9->Caption=dt4.FormatString("yyyy-mm-dd hh:nn:ss"); // 방법4
dt5.Val=dt5.Val+iday+itime/24.0;
Label10->Caption=dt4.FormatString("yyyy-mm-dd hh:nn:ss"); // 방법5
}
//---------------------------------------------------------------------------
방법4와 방법5가 아주 정확한데 방법5가 가장 정확할것 같습니다.
그런데 그럴필요까지는... 그냥 IncHour쓰시면 될듯...
그럼....
초보 님이 쓰신 글 :
: Now()+1 을 하면 현재일에서 1일이 추가되잖아요.
:
: 그럼 1시간 추가할때는 어떻게 해야 하나요?
: Time() +1 해봐야 현재시간만 나오네요.
:
: Time()+ 0.04167 로 하면 1시간이 추가되는데요.(0.몇초 차이나요)
: 이렇게 해도 되는 건가요?
|