gpt4 book ai didi

c++ - 检查两个 TDateTime 变量

转载 作者:行者123 更新时间:2023-11-30 02:03:08 26 4
gpt4 key购买 nike

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

最佳答案

相差 1 天 22 小时。

TDateTime在 Delphi 和 C++ Builder 中是 double ,其中整数部分(小数点左侧的部分)存储自基准日期 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 采用了它。

关于c++ - 检查两个 TDateTime 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12386266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com