1

我正在使用 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?

4

2 回答 2

4

差别是 1 天 22 小时。

TDateTime在 Delphi 和 C++ Builder 中是双精度数,其中整个部分(小数点左侧的部分)存储自 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++ 示例。

至于相等性(一个日期在另一个日期之后),您可以使用标准><>=<=!===运算符。我也在下面证明了这一点。

这是一个可以解释的简单示例(在 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 采用了它。

于 2012-09-12T15:08:48.327 回答
0

您可以使用正常的-, +, <,>和with 。===TDateTime

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

于 2012-09-12T10:42:59.010 回答