1

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

2 つの値の違いは 1 日だけです。1899 年 12 月 31 日が印刷され、1 のようなものではないのはなぜですか?

4

2 に答える 2

4

その差は1日22時間。

TDateTimeDelphi および C++ Builder では double であり、整数部分(小数点の左側の部分)は 1899 年 12 月 30 日の基準日からの日数を格納し(下記の注を参照)、小数部分(小数点の右側の部分) は時間です。

減算後に表示される 1899 は、1 日が 1 日未満であるため、数値の整数部分がゼロであり、前述したように、ゼロの日付は 1899 年 12 月の基準日です。その基準日より 1 日後です ( として表される場合TDateTime、日付は 1899 年 12 月 31 日と解釈されます。

22 時間の時間部分はおよそ0.9167(実際には0.916666666666667) で、1 日の 22/24 を表します。

Delphi のランタイム ライブラリには というユニットが含まれており、DateUtilsIIRC は C++ Builder でも利用できます (そのためのヘッダー ファイルがあります) DaysBetweenここで使用できる C++ の例があります。

等しい (ある日付が別の日付になる) 限り、標準>の 、<>=<=!=、および==演算子を使用できます。これについても以下で説明しました。

以下に簡単な例を示します (このマシンには C++ Builder がインストールされていないため、Delphi の場合)。

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 がそれを採用しました。

于 2012-09-12T15:08:48.327 に答える
0

-通常の 、+<>==および=を使用できますTDateTime

したがって、ある日付が別の日付よりも進んでいるかどうかを確認するには、たとえば、それらを減算して、結果がゼロより大きいか小さいかを確認できます。

于 2012-09-12T10:42:59.010 に答える