Отсчет времени? - PullRequest
       8

Отсчет времени?

0 голосов
/ 27 февраля 2020

Я пытаюсь отсчитывать время суток (24-часовой формат). Это мое решение до сих пор:

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 3600, (secs div 60) mod 60, secs mod 60]);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TargetTime: TTime;
  s: string;
begin
  s := TimeDiffStr(TimeToStr(Now), TimeToStr(TargetTime));
end;

Если Now, например, 15:35:02, а целевое время - 21:44:59, выходной сигнал правильный (06:09:57). Однако, если Now равно 15:35:02 и целевое время равно 01:32:23, вместо обратного отсчета с 09:57:21, оно будет считать вверх, поскольку функция не знает, что целевое время находится в другой день. .

Как я могу определить разницу между двумя значениями времени в разные дни?

1 Ответ

4 голосов
/ 27 февраля 2020

Во-первых, нет необходимости передавать строки. Если вы начинаете с TTime и конвертируетесь в TTime, то просто передаете TTime вокруг.

Секунда, поскольку вы имеете дело только с временными значениями, если целевое время должно быть на следующем день, вам нужно добавить 24 часа, чтобы у вас был TDateTime, который фактически представляет следующий день.

Попробуйте это:

uses
  ..., DateUtils;

function TimeDiffStr(const t1, t2: TTime): string;
var
  d1, d2: TDateTime;
  secs: Int64;
begin
  d1 := t1;
  if t2 < t1 then
    d2 := IncDay(t2) // or IncHour(t2, 24)
  else
    d2 := t2; 
  secs := SecondsBetween(d1, d2);
  Result := Format('%2.2d:%2.2d:%2.2d', [secs div 3600, (secs div 60) mod 60, secs mod 60]);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TargetTime: TTime;
  s: string;
begin
  TargetTime := ...;
  s := TimeDiffStr(Time(), TargetTime);
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...