2012-09-12 164 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,所以我不知道'TDateTime'的確切成員函數是這樣做的。您應該能夠通過BCB幫助系統快速找到它。 –

回答

0

你可以用你的正常-+<>===TDateTime

因此,要查看某個日期是否超前於另一個日期,可以將其相減,看看結果是大於還是小於零。

+0

小心時區跳轉http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result –

+0

@tu,'TDateTime'基本上是一個'double',它把日期當作整數部分,把時間當成分數,所以我相信它不關心時區,但我並不是很確定。 – SingerOfTheFall

+0

我編輯了我的主帖。請看一看。 –

4

區別是1天22小時。

TDateTime在Delphi和C++ Builder中是一個雙精度值,其中整個部分(小數點左邊的部分)存儲自1899年12月30日的基準日以來的天數(請參見下面的註釋),以及小數部分(小數點右邊的部分)就是時間。

您在減法後看到的1899年是因爲您的日子不足一整天,因此整個部分的數字爲零,並且正如我所提到的零日期是1899年12月的基準日期由於你的日期爲1天比基準日期以後(當作爲TDateTime所示,日期被解釋爲12月31日,1899年

22小時的時間部分大約0.9167(實際上,0.916666666666667),它代表一天22/24th時間。

德爾福的運行時庫包含一個名爲DateUtils的單元,該單元可用於C++ B uilder(有一個頭文件),其中包含的功能可以幫助你,比如DaysBetween,你可能會覺得有用。有可用的C++示例here

至於平等(一個接一個的日期的存在),你可以使用標準的><>=<=!=,並==運營商。我也在下面演示了這一點。

下面是一個簡單的例子(在Delphi,因爲我沒有這臺機器上安裝了C++ Builder中),這或許可以解釋:

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. 

這會產生這樣的輸出:

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 

注意:微軟爲COM建立了基準日期,並且出於兼容性原因,Delphi/C++ Builder採用了它。