その差は1日22時間。
TDateTime
Delphi および 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 のランタイム ライブラリには というユニットが含まれており、DateUtils
IIRC は 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 がそれを採用しました。