使用Delphi将HH:MM:SS转换为秒或分钟

5

有人能告诉我将格式为HH:MM:SS的持续时间转换为仅秒或分钟的最佳方法吗?

例如:00:01:49 = 109秒

我正在使用这段代码,但它不起作用。

var
i: real;
j: integer;
begin
i := frac(real(StrToTime('00:00:01')));
j := trunc(frac(real(StrToTime('01:00:00'))) / i );
memo2.lines.add(inttostr(j));

当我尝试使用00:10:00运行此代码时,返回值为599。
谢谢。
5个回答

9

使用 DateUtils 工具包:

WriteLn(SecondOfTheDay(StrToTime('00:10:00')));
WriteLn(MinuteOfTheDay(StrToTime('00:10:00')));

输出:

600
10

您的代码无法正常工作的原因是浮点数值通常不能被准确表示。为了避免关于 TDateTime 如何表示时间的所有实现细节,请使用 SysUtils 和 DateUtils 中的内置函数,具体请参见 日期和时间支持

7

TTimeSpan 是一个非常灵活的时间处理工具,它可以在 System.TimeSpan 单元中找到。您可以使用不同的单位(秒、分钟、小时等)获取结果并根据需要进行格式化。

var
  timeSpan: TTimeSpan;
begin
  timeSpan := TTimeSpan.Parse('00:01:49');
  memo2.lines.add(Format('%1.1f min', [timeSpan.TotalMinutes]));
end;

4

使用DecodeTime函数:

http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.DecodeTime

因此,您的代码应该像这样:

DecodeTime(StrToTime('00:00:01'), Hour, Min, Sec, MSec);

一个返回秒数的函数应该像这样:
function GetSeconds(ATimeString: string): Integer;
var
  Hour, Min, Sec, MSec: Word;
begin
  DecodeTime(StrToTime(ATimeString), Hour, Min, Sec, MSec);
  Result := Hour * 3600 + Min * 60 + Sec;
end;

1
时间跨度在'47:50'这个例子中失败了(溢出,我不知道为什么)。我的回答是:
function GetSecondsFromString(ATimeString: string): Double;
var
  arr: TStringdynArray;
  J, I: Integer;
  tf: TFormatSettings;
begin
  Result:= 0;
  arr:= StrUtils.SplitString(ATimeString, ':');
  I:= High(arr);
  if I < 1 then
    exit;
  if I = 2 then
  begin
    if StrTointDef(arr[0], 0) > 23 then
      exit;
    Result:= StrtoIntDef(arr[0], 0) * 3600;
  end;
  Result:= Result + (StrToIntDef(arr[I - 1], 0) * 60);
  J:= Pos('.', arr[I]);
  if (J > 1) and (J < arr[I].Length) then
  begin
    tf:= TFormatSettings.Create;
    tf.DecimalSeparator:= '.';
    Result:= Result + StrToFloat('0' + Copy(arr[I], Pos('.', arr[I])), tf);
    arr[I]:= Copy(arr[I], 1, Pos('.', arr[I]) - 1);
  end;
  Result:= Result + StrToIntDef(arr[I], 0);
end;

0
这不是一个独立的答案,而只是对Uwe的回答的扩展。请给他点赞。
{ Converts a string formatted like 'hh:mm:ss' to seconds.
  Returns -1 is the string does not contain a valid time. 

    StringToSeconds('00:01:30')     // returns 90 (sec)
    StringToSeconds('01:30')        // returns 5400 (sec)
    StringToSeconds('10')           // returns 864000 (sec)
    StringToSeconds('1.30')         // returns -1
    StringToSeconds('x')            // returns -1                           }

function StringToSeconds(CONST s: String): integer;
VAR
  TimeSpan: TTimeSpan;
begin
  TRY
   TimeSpan:= System.TimeSpan.TTimeSpan.Parse(s);
   Result := round(TimeSpan.TotalSeconds);
  EXCEPT
   Result:= -1;
  end;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接