【问题标题】:Checking two TDateTime variables检查两个 TDateTime 变量
【发布时间】:2012-09-05 08:39:24
【问题描述】:

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

【问题讨论】:

  • 只需将它们相减,“-”运算符会返回另一个包含差异的 TDateTime。
  • 减法的结果是TDateTime,所以输出仍然是日期格式。您需要以某种方式提取数值。对于最新的 BCB,我没有使用 VCL,所以我不知道执行此操作的 TDateTime 的确切成员函数。您应该可以通过 BCB 帮助系统快速找到它。

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


【解决方案1】:

您可以将普通的-+&lt;&gt;===TDateTime 一起使用。

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

【讨论】:

  • @tu, TDateTime 基本上是一个double,它将日期作为整数部分,将时间作为分数,所以我相信它不关心时区,我'我不太确定。
  • @Darryl,试着让你的两个testCompounds 像这样:ReplaceTime( testFirstDate, testFirstTime)
  • @SingerOfTheFall:我试过这个:TDateTime testCombined1 = ReplaceTime(testFirstDate,testFirstTime)。但我收到此错误:E2285 找不到匹配的 'TDateTime::TDateTime(const TDateTime&)'
  • 我如何处理 const 部分。因为我认为这是我误解的部分。
【解决方案2】:

相差 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++ 示例here

就相等而言(一个日期在另一个日期之后),您可以使用标准的&gt;&lt;&gt;=&lt;=!=== 运算符。我也在下面演示了这一点。

这里有一个简单的例子(在 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 采用了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多