首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查两个TDateTime变量

检查两个TDateTime变量
EN

Stack Overflow用户
提问于 2012-09-12 18:34:52
回答 2查看 2.3K关注 0票数 1

我正在使用C++生成器,并有以下问题:

我想要检测一个日期/时间是否晚于另一个日期/时间,以及晚了多少。

下面是我当前的代码:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

发布于 2012-09-12 23:08:48

差异是1天,22小时。

Delphi和C++生成器中的TDateTime是一个双精度型,其中整个部分(小数点左侧的部分)存储自1899年12月30日(见下文注释)的基准日期以来的天数,而小数部分(小数点右侧的部分)是时间。

你在减法后看到的1899是因为你只有不到一整天的时间,因此数字的整个部分是零,正如我前面提到的,零的日期是1899年12月的基准日期。因为您日期比基准日期晚1天(当表示为TDateTime时,该日期被解释为1899年12月31日。

22小时的时间部分大约是0.9167 (实际上是0.916666666666667),表示一天中的22/24。

C++的运行时库包含一个名为DateUtils的单元,C++构建器也可以使用它(有一个头文件),其中包含可能对您有帮助的函数,比如您可能会发现有用的DaysBetween。有一些使用可用的here的C++示例。

只要相等(一个日期在另一个日期之后),您可以使用标准的><>=<=!===运算符。我在下面也演示了这一点。

这里有一个简单的例子(在Delphi语言中,因为我没有在这台机器上安装C++生成器)可以解释:

代码语言:javascript
复制
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.

这将产生以下输出:

代码语言:javascript
复制
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采用了它。

票数 4
EN

Stack Overflow用户

发布于 2012-09-12 18:42:59

您可以将常规的-+<>===TDateTime配合使用。

因此,要查看一个日期是否在另一个日期之前,例如,您可以减去它们,看看结果是大于还是小于零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12386266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档