检查两个TDateTime变量

时间:2012-09-12 10:34:52

标签: c++ c++builder vcl datediff tdatetime

我正在使用C ++ Builder并提出以下问题:

我想检测一个日期/时间是否晚于另一个日期/时间,以及多少。

这是我目前的代码:

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?

2 个答案:

答案 0 :(得分:4)

差异是1天,22小时。

Delphi和C ++ Builder中的

TDateTime是双倍的,其中整个部分(小数点左边的部分)存储自1899年12月30日基准日期以来的天数(见下面的注释) ),小数部分(小数点右边的部分)是时间。

你在减法之后看到的1899是因为你有不到一整天,因此这个数字的整个部分是零,正如我所提到的,零日期是1899年12月的基准日期。由于您的日期比该基准日期晚1天(当表示为TDateTime时,该日期将被解释为1899年12月31日。

22小时的时间部分约为0.9167(实际上为0.916666666666667),代表一天的22/24。

Delphi的运行时库包含一个名为DateUtils的单元,IIRC也可用于C ++ Builder(有一个头文件),其中包含可能对您有帮助的功能,例如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

注意:基准日期是Microsoft为COM建立的,出于兼容性原因,Delphi / C ++ Builder采用了它。

答案 1 :(得分:0)

您可以将普通-+<>===TDateTime一起使用。

因此,要查看一个日期是否先于另一个日期,您可以,例如,减去它们,看看结果是大于还是小于零。