Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 603
user3594984 Avatar asked May 02 '14 04:05

user3594984


3 Answers

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.

like image 128
LU RD Avatar answered Nov 15 '22 06:11

LU RD


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;
like image 7
Uwe Raabe Avatar answered Nov 15 '22 04:11

Uwe Raabe


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;
like image 3
Graymatter Avatar answered Nov 15 '22 05:11

Graymatter