Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-04-2004
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
Diferencia de horas

Hola. Estuve buscando en los foros acerca de mi problema, pero lo que encontre no me sirvio.
Estoy haciendo un programa que controle el tiempo de conexion a internet. Cuando me conecto, alamacena la hora en una variable, y cuando me desconecto en otra. El problema esta cuando quiero restar esas dos horas, por ejemplo: 05:25:01 am y 05:25:00 am, el resultado es 12:00:00 am. Yo quiero que me diga la diferencia entre esas horas, que seria 00:00:01.
Si me pueden ayudar se los agradezco.
Responder Con Cita
  #2  
Antiguo 16-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quizá te sirvan algunas de las funciones de la unidad DateUtils como HoursBetween, MinutesBetween, SecondsBetween, etc.

// Saludos
Responder Con Cita
  #3  
Antiguo 17-04-2004
sanxpue sanxpue is offline
Miembro
 
Registrado: jul 2003
Posts: 196
Poder: 21
sanxpue Va por buen camino
Y por que no mejor¡¡¡

y por que no mejor lo haces con un timer que cada segundo incremente una variable, osea un boton para que te conectes la variable la pones en 0 y guardas la hora que empezo y despues cuando termines sabras bien que tendras.

asi si te quedas conectado por 3 dias no habra problema y sabras cuantas horas minutos estan conectados.

por que puede ser que se desconecte por ejemplo una hora antes de cumplir el dia entonces si que te veras en lios por que no sabras si fue 23 horas que estuvieron conectados o 47 horas o etc..

cuando te conectas a internet al
Código:
  Seg := 0;
  timer1.Enabled := True;
  //aqui guadas la variable de a que hora entro asi como tambien el dia
y en el procedimiento del Timer

Código:
procedure tform1.Timer....
.
.
Begin
  inc(Seg);
  if Seg = 60 Then
  Begin
   Seg := 0;
   Inc(Min);
  End;
  If Min = 60 Then
  Begin
    Min := 0;
    Inc(Horas);
  End;
  //este seria asi como muy opcional pero valido
  If Horas = 24 Then
  Begin
    Horas := 0;
    Inc(Dias);
  End;
End;
entonces cuando paras tu actividad en internet en lugar de restar sumas,
esperando que te sirva la idea
__________________
saludos desde Puebla Mexico..
asanxt@hotmail.com
"como siempre a sus ordenes y siempre con buena cara"
'lolita me excitas, perversa piel de melocotón'
Responder Con Cita
  #4  
Antiguo 17-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por sanxpue
y por que no mejor lo haces con un timer que cada segundo incremente una variable
Esto no es necesario, basta que en lugar de tomar el tiempo (TTime) de inicio y término tome la fecha y hora (TDateTime) y funciones como las que le indico devolverán el número correcto.

// Saludos
Responder Con Cita
  #5  
Antiguo 21-04-2004
the darkness the darkness is offline
Miembro
 
Registrado: ene 2004
Posts: 30
Poder: 0
the darkness Va por buen camino
hoursbetween

moderador.
he intentado buscar las funciones hoursbetween, secondsbetween y minutesbetween y solo me marca que no las reconoce delphi 5, no se si se necesite declarar una dcu en la forma o como deben hacerse.
muchas gracias.
att. eduardo maldonado
Responder Con Cita
  #6  
Antiguo 21-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola sanxpue. Solo te comento que el uso de timers no es preciso en el tiempo. Es decir, si un timer debiera ejecutarse cada segundo... lo hará siempre que sea posible, pero si el sistema está ocupado y la prioridad de tu tarea es baja, el timer podrá dispararse cada 5 segundos. Igualmente, si tu aplicación no responde, los mensajes del sistema que disparan el evento OnTimer serán reducidos a uno (independientemente de cuantos esten en cola), disparandose este evento una sola vez.

Por lo tanto, no es preciso para contar el tiempo de la forma que sugeris. Hace vos una prueba en un sistema medianamente ocupado, y podes comprobar como fallaria (y por mucho) incluso en intervalos pequeños de tiempo (digamos 5 minutos).

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 22-04-2004
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
No encontre nada sobre las funciones HoursBetween, MinutesBetween, SecondsBetween, etc. Y de la unica forma que lo puedo hacer es como dijo sanxpue.
Responder Con Cita
  #8  
Antiguo 22-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola. Te voy a dar autorización de usar las siguientes rutinas.. siempre que pongas una referencia en tu programa...

Código:
Function jachHoursBetween(Time1, Time2 : TDateTime) : Double;

Begin
  result := Time2 - Time1 * 24;
End;

Function jachMinutesBetween(Time1, Time2 : TDateTime) : Double;

Begin
  result := (Time2 - Time1) * 1440;
End;

Function jachSecondsBetween(Time1, Time2 : TDateTime) : Double;

Begin
  result := (Time2 - Time1) * 86400;
End;

Procedure jachHMSBetween(Time1, Time2 : TDateTime; var h,m,s : Word);

Begin
  h := trunc(jachHoursBetween(Time1, Time2));
  m := trunc(jachMinutesBetween(Time1, time2)) mod 60;
  s := trunc(jachSecondsBetween(Time1, time2)) mod 60;
End;
Si time2 es menor a time1 te devolverá una cantidad negativa de horas/minutos/segundos. Si no queres este comportamiento... simplemente añadí un abs() a la llamada.

Las rutinas te devuelven un número que indica la cantidad total de horas, minutos o segundos transcurrida entre dos fechas...

Si las fechas son:

Time1 = 21/04/2004 05:25:00 am
Time2 = 22/04/2004 05:26:01 am

Te devolverán:

HoursBetween => 24.0169444444444444
MinutesBetween => 1441.0166666666667777
SecondsBetween => 86461.0

Si te es mas útil.. podes usar el procedimiento jachHMSBetween, que te devuelve las horas, minutos y segundos transcurridos entre dos fechas:

jachHMSBetween => h=24, m=1, s=1 (24:01:01)

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 22-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Muy bonitas rutinas jachguate, no sé por qué me suena haberlas visto en algún lugar...

Están perfectas, nada más le integraría el trunc a las funciones en sí.

Por lo que veo estas funciones aparecieron hasta la versión 6 de Delphi.

// Saludos
Responder Con Cita
  #10  
Antiguo 22-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por roman
no sé por qué me suena haberlas visto en algún lugar...
En donde??? si acabo de inventarmelas... en base a los nombres dados, y agregando el ya tradicional prefijo jach, para evitar las colisiones...

Eso si, la forma del cálculo, pues no es nada del otro mundo... no trato de atribuirme la idea original, pero si que soy el autor de estas. Conrespecto a lo del trunc.. podriamos sobrecargar las funciones, pues a mi me parece que también la parte decimal puede ser muy útil para realizar cálculos, por ejemplo, si tenes un precio por hora... simplemente multiplicas el precio por jachHoursBetween y listo

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 22-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Pensandolo algo mas despacio... me parece que una función no se puede sobrecargar en base al tipo de dato devuelto por la misma... entonces habria que darles un nuevo nombre... incluso agregar un parámetro (redondear) para cambiar de comportamiento y no solo truncar sino también añadir la posibilidad de redondear... en fin... pa'que reinventamos la rueda, si en d6 ya existen... pues usemos esas, y pa'los que estamos abajo de d6.. ahi están estas otras.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 22-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
Eso si, la forma del cálculo, pues no es nada del otro mundo... no trato de atribuirme la idea original, pero si que soy el autor de estas.
Lo sé perfectamente. De hecho tú método me gusta más. Vamos, es cómo uno lo pensaría. Es curioso, pero al ver el código de borHoursBetween, borMinutesBetween, etc. me quedé pensando en como algunas cosas llegan a niveles absurdos de generalización. Si te has fijado en dicho código, que en esencia es el mismo, notarás que usan constantes como:

HoursPerDay = 24
MinsPerHour = 60
SecPerMin = 60
MSecsPerSec = 100

y me pregunto:

¿es que acaso existe la posibilidad de que en algún momento cambie el número de horas por día o el de minutos por hora????

O quizá es que mi visión es corta y no me doy cuenta de que se preparan para hacer cálculos una vez que poblemos Marte u otros planetas .

// Saludos
Responder Con Cita
  #13  
Antiguo 22-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
pues al paso que vamos, se va a poblar primero la luna... pero alli cómo medirian los dias???

Ya en serio.. supongo que es para hacer legible el código...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #14  
Antiguo 17-07-2007
josesantho josesantho is offline
Registrado
 
Registrado: may 2007
Posts: 2
Poder: 0
josesantho Va por buen camino
Talking Resta de Time (h:m:S) Calculo Exacto

Este procedimiento lo obtube de una formula vieja que usaba en visual foxpro hace muchos year,, quizas le puede ser de ayuda:

lo que hago es que con los segundos que me resultan de : SecondsBetween,,hago todos los calculos para obtener las horas, minutos y segundos exactos..
ahi le va


var
a,b,c,d,e,,:integer;
q0,q1:string;
fl0:Currency;
begin

c := SecondsBetween(Queryhora1.Value,Queryhora2.Value) + 1;
b := (c div 3600);
q1 := inttostr(b);
Edit5.Text := IntToStr(c);
Edit2.Text := q1;

d := (c-(b*3600)) div 60;
fl0 := int(d);
Edit3.Text := CurrToStr(fl0);

e := (c mod 60) - 1;
Edit4.Text := IntToStr(e);

Esper que le sea de ayuda
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 23:12:14.


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
Copyright 1996-2007 Club Delphi