Я использую 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 ++ Builder представляет собой двойное число, в котором вся часть (часть слева от десятичной запятой) хранит количество дней с базовой даты 30 декабря 1899 года (см. примечание ниже) и дробную часть ( часть справа от десятичной точки) время.
1899, который вы видите после вычитания, объясняется тем, что у вас меньше целого дня, и поэтому вся часть числа равна нулю, и, как я уже говорил, нулевая дата является базовой датой в декабре 1899 года. на 1 день позже этой базовой даты (если она представлена в виде TDateTime
Дата интерпретируется как 31 декабря 1899 года.
Время на 22 часа составляет примерно 0.9167
(на самом деле, 0.916666666666667
), что представляет 22/24-е сутки.
Библиотека времени выполнения 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
ПРИМЕЧАНИЕ. Базовая дата была установлена Microsoft для COM, и по соображениям совместимости Delphi / C ++ Builder принял ее.
Вы можете использовать свой обычный -
, +
, <
, >
,==
а также =
с TDateTime
,
Таким образом, чтобы увидеть, опережает ли одна дата другую, вы можете, например, вычесть их и посмотреть, будет ли результат больше или меньше нуля.