![]() |
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. |
Quizá te sirvan algunas de las funciones de la unidad DateUtils como HoursBetween, MinutesBetween, SecondsBetween, etc.
// Saludos |
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; Código:
procedure tform1.Timer.... esperando que te sirva la idea |
Cita:
// Saludos |
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 |
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. ;) |
No encontre nada sobre las funciones HoursBetween, MinutesBetween, SecondsBetween, etc. Y de la unica forma que lo puedo hacer es como dijo sanxpue.
|
Hola. Te voy a dar autorización de usar las siguientes rutinas.. siempre que pongas una referencia en tu programa... :p
Código:
Function jachHoursBetween(Time1, Time2 : TDateTime) : Double; 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. ;) |
Muy bonitas rutinas jachguate, no sé por qué me suena haberlas visto en algún lugar... :D
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 |
Cita:
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 :eek: Hasta luego. ;) |
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. ;) |
Cita:
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 :p . // Saludos |
pues al paso que vamos, se va a poblar primero la luna... pero alli cómo medirian los dias??? :D
Ya en serio.. supongo que es para hacer legible el código... Hasta luego. ;) |
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 |
La franja horaria es GMT +2. Ahora son las 06:25:02. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi