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



有人能告诉我将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

感谢

使用DateUtils单位:

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

输出:

600
10

代码不起作用的原因是浮点值通常无法准确表示。要避免TDateTime如何表示时间的所有实现细节,请使用SysUtils和DateUtils中的内置函数,请参阅日期和时间支持。

处理持续时间的一个非常灵活的工具是在单位System.TimeSpan中找到的TTimeSpan。您可以获得不同单位(秒、分钟、小时…(的结果,并根据需要设置格式。

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

使用解码时间:

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;

Timespan失败,例如出现"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;

这不是一个独立的答案,只是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;

相关内容

  • 没有找到相关文章

最新更新