convert HH:MM:SS to seconds or minutes with delphi

2019-05-12 08:45发布

Can someone advise me on the best way to convert a duration formated HH:MM:SS to seconds or minutes only?

ie. 00:01:49 = 109secs

I´m using this code but not work

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));

when I try the code with 00:10:00 return 599

thanks

3条回答
淡お忘
2楼-- · 2019-05-12 09:38

Using the DateUtils unit:

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

Outputs:

600
10

The reason why your code is not working is that floating point values often can not be exactly represented. To avoid all implementation details about how a TDateTime represents the time, use the built in functions in SysUtils and DateUtils, see Date and Time Support.

查看更多
时光不老,我们不散
3楼-- · 2019-05-12 09:45

Use DecodeTime:

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

So your code should look like this:

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

A function that returns the seconds should look something like this:

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;
查看更多
疯言疯语
4楼-- · 2019-05-12 09:49

A very flexibel tool for handling durations is TTimeSpan found in unit System.TimeSpan. You can get the result in different units (second, minutes, hours, ...) and format that to your needs.

var
  timeSpan: TTimeSpan;
begin
  timeSpan := TTimeSpan.Parse('00:01:49');
  memo2.lines.add(Format('%1.1f min', [timeSpan.TotalMinutes]));
end;
查看更多
登录 后发表回答