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 를 이용하는 게 정석,