Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda: función HH:MM:SS (https://www.clubdelphi.com/foros/showthread.php?t=55182)

MaMu 09-04-2008 23:08:55

Ayuda: función HH:MM:SS
 
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;

Código Delphi [-]
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:

Código Delphi [-]
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 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í:

Código Delphi [-]
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

Cita:

Empezado por mamu (Mensaje 278763)
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;

Código Delphi [-]
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,

Código Delphi [-]
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

Cita:

Empezado por egostar (Mensaje 278785)
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

Cita:

Empezado por ixMike (Mensaje 278786)
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

Cita:

Empezado por dec (Mensaje 278793)
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

Cita:

Empezado por egostar (Mensaje 278788)
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:

Código Delphi [-]
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

Cita:

Empezado por mamu (Mensaje 278845)
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

Cita:

Empezado por egostar (Mensaje 278848)
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?

Código Delphi [-]
  res := IncSecond(tiempototal, 125487770);

DateUtils en el uses, of course. ;)

ixMike 10-04-2008 14:05:52

Cita:

Empezado por keyboy (Mensaje 278853)
¿Se han fijado en el código de TimeToStr?

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

Código Delphi [-]
function SecondsToTime(seconds: Integer) : TTime;
begin
  result := (seconds / (24 * 60 * 60));
end;

(* *)

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



Salu2 :)


La franja horaria es GMT +2. Ahora son las 09:26:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi