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