我使用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 ++生成器是一个双,其中,所述整体部分(部分小数点的左边)存储的天数自1899年12月30日的基准日期(下面见注)和小数部分(部分小数点右边)是时间。
你减法后看到的1899年是因为你不到一整天,因此数量的整数部分是零,正如我所说的零的日期是1899年十二月,基准日由于您的日期是1天比基准日期以后(当作为表示TDateTime
,日期被解释为1899年12月31日。
22小时的时间部分是大约0.9167
(实际上, 0.916666666666667
),它代表一个天的22 / 24ths。
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
注:基准日是由微软COM成立,出于兼容性考虑的Delphi / C ++ Builder中采用它。
您可以使用正常的-
+
, <
, >
, ==
和=
与TDateTime
。
所以,看一个日期提前的另一个,你可以,例如,减去他们,看看如果结果大于或大于零较小。