2012-09-12 133 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采用了它。