我正在使用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;
在上面的例子中,打印出以下内容:18/12/1899
两个值之间的差异仅为1天.为什么:打印时间为31/12/1899,而不是:1?
解决方法:
差异是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
.有一些可用的例子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采用了它.