PDA

Ver la Versión Completa : Ayuda: función HH:MM:SS


MaMu
09-04-2008, 23:08:55
Hola, necesito hacer una función que partiendo de una varieble float que contiene el tiempo total en segundos, me devuelva un string formateado en HH:MM:SS;


function ConvertTime(tiempo:float):string; //devuelve hh:mm:ss como string

....
var tiempototal:float;
begin
tiempototal:=125487770;
Label1.Caption:=ConvertTime(tiempototal);
end;



Alguna sugerencia o idea??

Saludos y gracias

dec
09-04-2008, 23:24:39
Hola,

No sé si esto podría servirte:


function SecondsToTime(seconds: Integer) : TTime;
begin
result := (seconds / (24 * 60 * 60));
end;

(* *)

begin
ShowMessage( TimeToStr( SecondsToTime(60) ) );
end;



Lo encontré en este hilo de Delphi-PRAXiS (http://www.delphipraxis.net/post49760.html) y me pareció estupendo. Pero no sé si es lo que necesitas o qué...

ixMike
09-04-2008, 23:27:14
Bueno, así de primeras pienso que si el tiempo lo guardas en segundos, pues en vez de un float podrías utilizar un integer, o Int64. Sería algo así:


function ConverTime(Seconds: Integer): string;
begin
Result:=IntToStr(Seconds div 3600)+':'+IntToStr(Seconds div 60)+':'+IntToStr(Seconds mod 60);
end;



Sencillo, ¿no? Con divisiones y un resto.

Salu2. :)

Edito: vaya, dec se me adelantó... bueno mejor utiliza ese método, porque este me acabo de fijar que, por ejemplo, si tiene una hora y cinco minutos aparecería "1:5:0". En vez de IntToStr tendría que utilizar Format.

cHackAll
09-04-2008, 23:43:49
Hola, necesito hacer una función que partiendo de una varieble float que contiene el tiempo total en segundos, me devuelva un string formateado en HH:MM:SS;...

Bueno, tomando la función de ixMike y sin dejar de usar un float;

function ConvertTime(Seconds: Extended): string;
var Value: int64;
begin
Value := Trunc(Seconds);
Result := IntToStr(Value div 3600) + ':' + IntToStr(Value div 60) + ':' + IntToStr(Value mod 60);
end;

Valga la redundancia
Saludos

egostar
09-04-2008, 23:56:02
Pienso que seria mejor hacer esto,


function ConverTime(Seconds: Integer): string;
begin
Horas := Seconds div 3600;
Minutos := (Seconds - (Horas*3600)) div 60;
Segundos := (Seconds - (Horas*3600)) mod 60;
Result:= IntToStr(Horas)+':'+Format('%.*d',[2,Minutos])+':'+Format('%.*d',[2,Segundos]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ConverTime(40000));
end;


Salud OS

ixMike
10-04-2008, 00:00:20
Pienso que seria mejor hacer esto

Ya, a eso me refería con lo del Format, pero la que ha expuesto dec viene al dedillo, ya que el tipo TDateTime no es más que un float donde la unidad es un día, así:

una hora = 1/24
un minuto = 1/(24*60)
un segundo = 1/(24*60*60)
un mes = 30

y así...

egostar
10-04-2008, 00:03:05
Ya, a eso me refería con lo del Format, pero la que ha expuesto dec viene al dedillo, ya que el tipo TDateTime no es más que un float donde la unidad es un día, así:

una hora = 1/24
un minuto = 1/(24*60)
un segundo = 1/(24*60*60)
un mes = 30

y así...

Si, pero le veo un pequeño detalle, que pasa si la cantidad de segundos sobrepasa las 24 horas :rolleyes::rolleyes:

Salud OS

dec
10-04-2008, 00:14:52
Hola,

Bien apuntado egostar. A mí me pareció muy elegante la solución (ya he dicho que la encontré, no es "mía") pero, me temía que habría implicaciones... y todavía creo que podría haber más. Creo que habría que esperar a que quien inició el hilo comente algo a todo esto. ;)

egostar
10-04-2008, 00:23:38
Hola,

Bien apuntado egostar. A mí me pareció muy elegante la solución (ya he dicho que la encontré, no es "mía") pero, me temía que habría implicaciones... y todavía creo que podría haber más. Creo que habría que esperar a que quien inició el hilo comente algo a todo esto. ;)

Yo se amigo Dec, y en verdad que eso soluciona cualquier problema sin tanto rollo y efectivamente es elegante, pero ya sabes como soy siempre veo el lado malo de las cosas :o :cool: :D

Como dices, habrá que esperar al aludido para que nos diga :)

Salud OS

ixMike
10-04-2008, 00:45:38
Si, pero le veo un pequeño detalle, que pasa si la cantidad de segundos sobrepasa las 24 horas :rolleyes::rolleyes:

Salud OS

Bueno, en ese caso, el detalle sería mostrar los días, ¿no? :p

Vamos, al menos yo lo haría así en mis aplicaciones. Pero eso ya sería entrar en cuestión de gustos...

MaMu
10-04-2008, 04:20:22
SOLUCIONADO

Utilice este procedimiento:


function ConverTime(Seconds: Integer): string;
var Horas,Minutos,Segundos:integer;
begin
Horas := Seconds div 3600;
Minutos := (Seconds - (Horas*3600)) div 60;
Segundos := (Seconds - (Horas*3600)) mod 60;
Result:= Format('%.*d',[2,Horas])+':'+Format('%.*d',[2,Minutos])+':'+Format('%.*d',[2,Segundos]);
end;


Con respecto a los dias, no los necesito, puesto a que por otro lado, el ingreso de datos esta limitado a un máximo de 24hs.

Saludos

egostar
10-04-2008, 04:34:45
Con respecto a los dias, no los necesito, puesto a que por otro lado, el ingreso de datos esta limitado a un máximo de 24hs.


En ese caso, la mejor opción es la que mostró nuestro amigo dec, sin tantas vueltas :rolleyes::rolleyes::cool::)

Yo me complique la vida, pensando que pudiese haber cantidades mayores a 24 horas, por lo que usar TimetoStr() no iba a ser correcto y esto por el número de segundos que colocaste en tu primer intervención.

tiempototal:=125487770;

Salud OS

MaMu
10-04-2008, 05:13:02
En ese caso, la mejor opción es la que mostró nuestro amigo dec, sin tantas vueltas :rolleyes::rolleyes::cool::)

Yo me complique la vida, pensando que pudiese haber cantidades mayores a 24 horas, por lo que usar TimetoStr() no iba a ser correcto y esto por el número de segundos que colocaste en tu primer intervención.

tiempototal:=125487770;

Salud OS

Sin embargo, si convierto un valor de hora 0, la función TimeToStr, me devuelve 12:XX:XX:xm, y como lo estoy usando para la duración de archivos de audio, tampoco me interesa el AM/PM. Ojo, he probado una y otra vez, y siempre me pasa lo de las 12hs.

keyboy
10-04-2008, 05:18:56
¿Se han fijado en el código de TimeToStr?

Bye

Neftali [Germán.Estévez]
10-04-2008, 09:50:52
Digo yo...
¿Y no será mejor usar la función que la VCL tiene para eso?


res := IncSecond(tiempototal, 125487770);


DateUtils en el uses, of course. ;)

ixMike
10-04-2008, 14:05:52
¿Se han fijado en el código de TimeToStr?


Puede ser... entonces mejor usar FormatDateTime, con el formato 'hh:nn:ss'...


function SecondsToTime(seconds: Integer) : TTime;
begin
result := (seconds / (24 * 60 * 60));
end;

(* *)

begin
ShowMessage( FormatDateTime('hh:nn:ss', SecondsToTime(60) ) );
end;




Salu2 :)