빌더님 덕분에 많이 공부하고 있는 사람입니다.
빌더님 답변 내용 보면 학교다닐때 교수님이 강의하시는거 같고, 저는 멀뚱멀뚱 쳐다보는 신입생 일때로 돌아가는거 같습니다.
감사합니다.
빌더(TWx) 님이 쓰신 글 :
: 30억 님이 쓰신 글 :
: : 외산 장비에서 데이터가 날짜형이 아닌 실수형으로 저장이 됩니다.
: : 저장된 실수형은 날짜형으로 변환해서 보여주고 있습니다.
: :
: : 그런데 이 파일에서 출력된 값이 43831.958328입니다.
: : 이 자료를 엑셀에 입력하고, 날짜형식으로 바꾸면 "YYYY-MM-DD HH:MM:SS"
: : "2020-01-01 23:00:00.00"이 됩니다.
: :
: : 그런데 빌더에서 코딩하면
: :
: : TDateTime tmpDateTime ;
: : tmpDateTime = 43831.958328 ;
: : Start_DOY = FormatDateTime ( "YYYY-MM-DD HH:MM:SS", tmpDateTime ) ;
: :
: : "2020-01-01 22:59:59" 가 나오는데,
: :
: : 혹시 미리세컨드에서 반올림 할 수 있는 방법이 있나요?
: :
: : 고수님들의 의견 부탁드립니다.
: :
: : 감사합니다.
:
:
:
:
: 답변:
:
:
: TDateTime은 파스칼 언어로 double 형으로 정의되어 있는 구조이고
: 표준이 아니라 플렛폼 간에 호환성이 없으므로 다른 C++ 컴파일러에서 사용할 수 없고.
:
: 64비트 Int64 타입이 지원되지 않던 초기 버전 델파이 컴파일러의 한계를 피해가기 위한 편법으로
: double 형으로 구현됐던 잔재가 지금 까지 이어져서 사용되고 있는 안좋은 케이스 임.
:
:
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TDateTime dt = 43831.958328 ;
:
: auto mS = MilliSecondOf(dt);
: auto delta = (round((double)mS / 1000) * 1000) - mS;
:
: Caption = FormatDateTime ( "YYYY-MM-DD HH:MM:SS", IncMilliSecond(dt, delta));
: }
:
:
:
: 플렛폼 간의 호환성을 위해선 C++20 지원하는 컴파일러로 std::chrono 를 이용하는 게 정석,
:
:
:
: