Проверка двух переменных TDateTime

Я использую 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?

2 ответа

Разница 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,

Таким образом, чтобы увидеть, опережает ли одна дата другую, вы можете, например, вычесть их и посмотреть, будет ли результат больше или меньше нуля.

Другие вопросы по тегам