2012-09-12 8 views
1

나는 C++ Builder를 사용하여 다음과 같은 질문이 있어요 :확인이 개 TDateTime으로 변수

내가 날짜/시간이 나중에 다른 날짜/시간보다 긴 경우 감지 걸려, 그리고 얼마나에 의해.

여기 내 현재 코드 : 위 예에서

TDateTime testFirstDate("11/09/2012"); 
TDateTime testFirstTime("14:00"); 

TDateTime testSecondDate("12/09/2012"); 
TDateTime testSecondTime("16:00"); 

TDateTime testCombined1 = testFirstDate + testFirstTime; 
TDateTime testCombined2 = testSecondDate + testSecondTime; 

TDateTime testDateDifference = testSecondDate - testFirstDate; 
std::cout << testDateDifference; 

, 다음 인쇄 얻는다 : 31/12/1899은

두 값의 차이는 단지 1 날이다. 왜 : 31/12/1899가 인쇄되고, 다음과 같은 것이 아닙니다. 1?

+0

"-"연산자는 차이를 유지하는 다른 TDateTime을 반환합니다. –

+0

시험해보세요. http://stackoverflow.com/questions/833340/calculate-time-between-2-tdatetime-with-a-twist – MarsRover

+0

뺄셈 결과는 'TDateTime'이므로 결과는 여전히 날짜에 있습니다. 체재. 어떻게 든 숫자 값을 추출해야합니다. BCB에서 가장 최근의 VCL에 대한 VCL이 아니기 때문에이 작업을 수행하는 TDateTime의 정확한 멤버 함수를 모른다. BCB 도움말 시스템을 사용하여 신속하게 찾을 수 있어야합니다. –

답변

0

사용할 수있는 일반 -, +, <, >, ==TDateTime=.

한 날짜가 다른 날짜보다 앞서 있는지 확인하려면 예를 들어 날짜를 뺀 다음 결과가 0보다 크거나 작은 지 확인할 수 있습니다.

+0

시간대 점프에주의하십시오. http://stackoverflow.com/questions/6841333/why-is-subtracting-the-two-times-in-1927-giving-a-strange-result –

+0

@tu, 'TDateTime' 기본적으로 정수 부분으로 날짜를 보유하는'double'입니다. 그리고 분수로서의 시간은 시간대를 신경 쓰지 않는다고 생각합니다. 그러나 저는 확신하지 못합니다. – SingerOfTheFall

+0

본인의 주요 게시물을 편집했습니다. 한번 봐주세요. –

4

차이는 1 일 22 시간입니다.

TDateTime은 델파이와 C++ 빌더에서 전체 부분 (소수점 왼쪽의 부분)이 기본 날짜 (1899 년 12 월 30 일 기준) 이후의 일 수를 저장하는 double 값입니다 (아래 참고 참조). 소수 부분 (소수점의 오른쪽 부분)은 시간입니다.

당신이 하루 종일이 아니기 때문에 뺄셈 이후에 표시되는 1899는 숫자의 전체 부분이 제로이고, 언급 한 바와 같이 제로의 날짜는 1899 년 12 월의 기본 날짜입니다 날짜 1 다음날 그 기준일보다 있기 때문에 TDateTime로 표시 할 때. (날짜)가 1899은

22 시간의 시간 부분이 거의 실제로 0.9167 (0.916666666666667 인 12 월 31 일로서 해석되고, 이는 나타낸다 22/24 시간.

Delphi의 런타임 라이브러리에는 IIRC가 C++ B에서 사용할 수있는 DateUtils이라는 유닛이 들어 있습니다. uilder도 있습니다 (헤더 파일이 있습니다). 유용 할 수있는 DaysBetween과 같이 도움이 될 함수가 들어 있습니다. 그것의 사용 가능한 C++ 예제는 here입니다.

지금까지 평등 (하나씩 날짜 존재), 당신은 표준 >, <, >=, <=, !=== 연산자를 사용할 수 있습니다. 나는 이것도 아래에서 설명했다.

BaseDate: 12/30/1899 00:00:00 
Diff as String: 12/31/1899 
Diff as Double: 1.08333333332848E+0000 
DaysBetween: 1 
EndDate after StartDate: TRUE 

참고 :이이 출력을 생성

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, DateUtils; 

var 
    StartDate, EndDate, Diff: TDateTime; 
begin 
    try 
    { TODO -oUser -cConsole Main : Insert code here } 
    // Base date, formatted in US date format 
    WriteLn('BaseDate: ', FormatDateTime('mm/dd/yyyy hh:nn:ss', 0)); 

    StartDate := EncodeDateTime(2012, 9, 11, 14, 0, 0, 0); 
    EndDate := EncodeDateTime(2012, 9, 12, 16, 0, 0, 0); 
    Diff := EndDate - StartDate; 

    WriteLn('Diff as String: ', DateToStr(Diff)); 
    WriteLn('Diff as Double: ', Diff); 
    WriteLn('DaysBetween: ', DaysBetween(EndDate, StartDate)); 

    // Equality 
    WriteLn('EndDate after StartDate`, EndDate > StartDate); 
    RegEx.Free; 
    ReadLn; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

: 설명 할 수있을 것을 (나는 C++ Builder는이 시스템에 설치되어 있지 않는 한, 델파이에서) 여기

은 간단한 예입니다 : 기본 날짜는 Microsoft에서 COM에 대해 설정했으며 호환성 이유로 Delphi/C++ Builder에서 채택했습니다.