C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[49736] Re:Re:감사합니다.
초보 [] 983 읽음    2007-06-28 13:43
1/24.0 을 더하면서 해야 겠네요.

사실 +1 이  하루가 올라간 날짜인지 잘 몰랐어요.

0    12/30/1899 12:00 am
2.75    1/1/1900 6:00 pm
-1.25    12/29/1899 6:00 am
35065    1/1/1996 12:00 am
Help를 찾다가 잘 읽어보지 않고 값을 이것 저것 넣었다 보니 아래처럼 된거지요.

다시 한번 감사드립니다.
500년은 절대 돌릴일이 없으니까 오차 걱정은 하지 않아도 되겠네요.



장성호 님이 쓰신 글 :
: 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.몇초 차이나요)
: : 이렇게 해도 되는 건가요?

+ -

관련 글 리스트
49734 [질문]시간 처리에 대해서... 초보 947 2007/06/28
49735     Re:[질문]시간 처리에 대해서... 장성호 1287 2007/06/28
49736         Re:Re:감사합니다. 초보 983 2007/06/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.