Вычтите две переменные TDATETIME в Delphi и верните результат в течение нескольких минут.

У меня два TDateTime переменные, как это:

s := StrToDateTime('03/03/2017 10:10:12');
e := StrToDateTime('04/04/2017 10:10:12');

Мне нужно выяснить разницу между ними, в hh:mm:ss формат.

...Between() функции не помогают мне здесь.

3 ответа

Решение

Используйте функцию DateUtils.SecondsBetween:

Uses
  DateUtils,SysUtils;

function TimeDiffStr(const s1,s2: String): String;
var
  t1,t2: TDateTime;
  secs: Int64;
begin
  t1 := StrToDateTime(s1); 
  t2 := StrToDateTime(s2); 
  secs := SecondsBetween(t1,t2);
  Result := Format('%2.2d:%2.2d:%2.2d',[secs div SecsPerHour,(secs div SecsPerMin) mod SecPerMin,secs mod SecsPerMin]);
end;

begin
  WriteLn(TimeDiffStr('03/03/2017 10:10:12','04/04/2017 10:10:12'));
  ReadLn;
end.

Из количества секунд рассчитайте часы, минуты и оставшиеся секунды.


Если вы хотите разницу в минутах, используйте функцию DateUtils.MinutesBetween:

function TimeDiffStr(const s1,s2: String): String;
var
  t1,t2: TDateTime;
  minutes: Int64;
begin
  t1 := StrToDateTime(s1); 
  t2 := StrToDateTime(s2); 
  minutes := MinutesBetween(t1,t2);
  Result := Format('%2.2d:%2.2d:%2.2d',[minutes div MinsPerHour,minutes mod MinsPerHour,0]);
end;

Вы можете использовать TTimeSpan (из модуля System.TimeSpan).

program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.TimeSpan;

var
  StartDate, EndDate: TDateTime;
  TS: TTimeSpan;
  Temp: string;
begin
  StartDate := StrToDateTime('03/03/2017 10:10:12');
  EndDate := StrToDateTime('04/04/2017 10:10:12');
  TS := TTimeSpan.Subtract(EndDate, StartDate);
  Temp := TS;
  WriteLn(Temp);  // Outputs 32.00:00:00
  // The next line outputs the same as the one above
  WriteLn(Format('%.2d:%.2d:%.2d:%.2d', [TS.Days, TS.Hours, TS.Minutes, TS.Seconds]));
  WriteLn(TS.TotalMinutes); // Outputs 4.60800000000000E+0004
  WriteLn(Trunc(TS.TotalMinutes)); // Outputs 46080

  // This one will give the output you want (768:00:00)
  WriteLn(Format('%.2d:%.2d:%.2d', [TS.Days * 24 + TS.Hours, TS.Minutes, TS.Seconds]));
  ReadLn;
end.

Во-первых, не используйте жестко запрограммированные строки для значений даты / времени. Это связано с проблемами локализации, и в любом случае это просто пустая трата. Использовать SysUtils.EncodeDate() а также SysUtils.EncodeTime() функции или DateUtils.EncodeDateTime() функция.

Во-вторых, ...Between() функции действительно могут быть использованы, в частности SecondsBetween(), Вы можете рассчитать отдельные компоненты из этого возвращаемого значения.

Попробуйте что-то вроде этого:

uses
  ..., SysUtils, DateUtils;

var
  s, e: TDateTime;
  diff: Int64;
  days, hours, mins, secs: Integer;
  s: string;
begin
  s := EncodeDateTime(2017, 3, 3, 10, 10, 12, 0);
  e := EncodeDateTime(2017, 4, 4, 10, 10, 12, 0);

  diff := SecondsBetween(e, s);

  days := diff div SecsPerDay;
  diff := diff mod SecsPerDay;

  hours := diff div SecsPerHour;
  diff := diff mod SecsPerHour;

  mins := diff div SecsPerMin;
  diff := diff mod SecsPerMin;

  secs := diff;

  s := Format('%d:%d:%d:%d', [days, hours, mins, secs]);
end;
Другие вопросы по тегам