Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   resultado de restar 2 horas (https://www.clubdelphi.com/foros/showthread.php?t=40589)

CarlosHernandez 21-02-2007 17:43:22

resultado de restar 2 horas
 
saludos a todos los del foro nuevamente...

estuve buscando en los foros viejos, y encontre informacion sobre la resta de 2 horas, lo tuve leyendo y analizando. bueno mi inquietud es la siguiente

restar 2 horas HE, HS y que me de un total(08:23:19) por ejemplo y hacer una condicion si es mayor o menor de 8 horas, con el codigo que puse me da el siguiente resultado= 08:23:19 a.m. y no quiero que aparezca (a.m.), otra cosa es que cuando pasa de 12 horas se vuelve loco, es decir si son 13 horas dice 1 hora, y el resultado no me da, bueno el codigo que use es el siguiente..

her hora de entrada
hsr hora de salida
hora resultado de la resta

Código:

var
  DifH, DifM, DifS, DifMs: Word;
  her,hsr,hora:ttime;
 

          //las hora estan en la tabla Horas
         
          her:=Tabla.IBQHorasHE.AsDateTime;
          hsr:=Tabla.IBQHorasHS.AsDateTime;


  DecodeTime((hsr) -(her), DifH, DifM, DifS, DifMs);
 
hora:= EncodeTime(DifH, DifM, DifS, DifMs);//aqui tranformo el resultado a
tipo hora pero no se como cambiar el formato de am/pm

  if hora>=strtotime('06:00:00') then begin
            cesta:=cesta+1;//esto es un contador
  end;

 
      end;

necesito hacer que "hora" me de 26:41:17 por ejemplo que si pasa mas de 12 horas no se tranforme a 1 o 2 horas...

acepto sugerencia de cambiar todo el codigo por uno mejor gracias.........................................................................:confused:

fdelamo 21-02-2007 18:14:48

Hola,

no se si te servirá de algo ...
Ya que TTime = TDateTime ...

Por que no lo haces así:

Para sumar dos horas a Now --> DosHorasMas := Now+((1/24)*2)
Para restar dos horas a Now --> DosHorasMenos := Now-((1/24)*2)

y los calculos los haces con la fecha incluida ...

aledieb 21-02-2007 18:16:35

No se pero porque no restas directamente las dos horas, eso te daria un número por ejemplo:

14:00:00 - 12:00:00 = 2.00

Tal ves de esta forma te sirve por lo menos para hacer los calculos.

CarlosHernandez 21-02-2007 18:19:02

fdelamo... puedes darme un poco mas de detalles por favor porque la verdad no entendi mucho como usarlo, podrias ser mas especifico o donde y como lo uso???????????

CarlosHernandez 21-02-2007 18:21:03

alejandro porque cuando resto las dos horas directamente me pasa lo mismo, si da mas de 12 horas, ejemplo 13 horas me dice 1 hora, y eso es lo que quiero corregir....

fdelamo 21-02-2007 18:27:52

Los valores TTime, TDate y TDateTime, representan las fechas de la siguiente manera: La parte entera es la fecha (la fecha 0 creo que es 31/12/1899, creo) y los decimales la hora, por tanto, una hora es 1/24, un minuto 1/24/60 ...

Si quieres sumar dos horas Fecha+2/24

No se si me explico ....

CarlosHernandez 21-02-2007 18:35:45

ok, entendi la logica, pero si tengo las 2 horas 08:13:14 a.m. y 09:52:17 p.m. como expreso esas 2 con el metodo que me diste?????????

fdelamo 21-02-2007 18:39:43

Al tenerlo en un TDate, TTime o TDateTime ya lo tienes así, ¿o es que tienes esas horas en texto?

CarlosHernandez 21-02-2007 18:46:52

restar hs-he

hora:=hs-((1/24)*hs);

asi lo puse y no me da, da otra hora y sigue dandome el formato am/pm, me imagino que lo exprese mal verdad??

fdelamo 21-02-2007 18:51:09

Si quieres restar dos horas, se hace directamente: hs-he, pero ten en cuenta que el resultado no es una hora, es la diferencia de horas, teniendo en cuenta que 1 hora = 1/24

CarlosHernandez 21-02-2007 19:08:05

exacto e alli el detalle, si resto directo, hs-he 11:02:10 p.m. - 08:59:10 a.m. son 14 horas 7 minutos, y me da 2:33:00 p.m.

como hago que el 2:33:00 p.m. se tranforme en 14:07:00?????????????

Lepe 21-02-2007 19:45:39

Si puedes, te aconsejo que cambies el tipo del campo; en lugar de usar hora usa un TimeStamp (fecha y hora todo en el mismo campo)

Después puedes usar de la unidad DateUtils, toda una batería de funciones:
- HoursBetween(fecha1, fecha2);
- MinutesBetween
- DaysBetween
- MillisecondsBetween
- etc.

La fecha y hora en sí misma, no se guarda con ningún formato de 12/24 horas. Es al tiempo de mostrarlo en pantalla cuando aplicas el formato que quieres. Para ello puedes usar FormatDateTime('hh:nn:ss',fecha1);

Al usar el formato de fecha+hora, no tendrás ningún problema en sumar dos fechas, o sumarle 33 horas, siempre obtendrás el resultado correcto.

Cita:

necesito hacer que "hora" me de 26:41:17
Para esto no hay solución inmediata, pero puedes apoyarte en las funciones mencionadas, o hacer el cálculo tu mismo:
Código Delphi [-]
var f1, f2 : TDatetime;
      h,m,s:word;
begin
 
s := seconsbetween(f1,f2);
h := s div 3600 ;
m := (s mod 3600) div 60; // el resto de la división anterior:
s := (s mod 3600) mod 60;

Edito:
El resultado no podrás codificarlo como una TTime, ni como TDateTime, ya que tiene el límite en 24 horas, por tanto, jamás podrás crear una hora con 26 horas.

Saludos

nuk3zito 21-02-2007 20:15:06

El windows es quien te define el formato de a.m. y p.m. o formato 24 Hrs.
Búscale por ese lado... y si es necesario, haz que tu aplicación cambie el formato cuando lo uilices.
Ahora que... pudieras agarrar la hora y "decodificarla" y construir tu propia cadena si es que no quieres cambiar el formato de hora de windows.

Suerte!

aledieb 21-02-2007 21:38:04

Si entendi correctamente te interesa saber cuanto tiempo paso entre dos horas distintas. Si es así lo que tendrias que hacer es:

vartipofloat:= Hora1-Hora2;

En vartipofloat tendras como resultado la cantidad de horas y minutos que pasaron, las horas en la parte entera y los minutos en los decimales.

Suerte

CarlosHernandez 23-02-2007 17:20:07

listo, gracias a todos por responder, ahora estoy probando todo y cuando me de perfecto publico el codigo......

NeoNew 24-03-2009 20:17:09

Código Delphi [-]
Function TimeBetween(xTimeFrom,xTimeTo: TTime): TTime;
var
  t12,t24 : TTime;
begin
  t12 := StrToTime('12:00:00');
  t24 := StrToTime('23:59:59');
  if xTimeFrom > t12  then
  begin
    Result := t24 - xTimeFrom + xTimeTo;
  end else
  begin
    Result := xTimeTo - xTimeFrom;
  end;
end;

Vicente Ivan 15-12-2009 23:07:04

sumar meses a una fecha
 
ejemplo
sumarle 48 meses a una fecha
o 4 años a una fecha
sin tener que utilizar decode



Cita:

Empezado por Lepe (Mensaje 183934)
Si puedes, te aconsejo que cambies el tipo del campo; en lugar de usar hora usa un TimeStamp (fecha y hora todo en el mismo campo)

Después puedes usar de la unidad DateUtils, toda una batería de funciones:
- HoursBetween(fecha1, fecha2);
- MinutesBetween
- DaysBetween
- MillisecondsBetween
- etc.

La fecha y hora en sí misma, no se guarda con ningún formato de 12/24 horas. Es al tiempo de mostrarlo en pantalla cuando aplicas el formato que quieres. Para ello puedes usar FormatDateTime('hh:nn:ss',fecha1);

Al usar el formato de fecha+hora, no tendrás ningún problema en sumar dos fechas, o sumarle 33 horas, siempre obtendrás el resultado correcto.



Para esto no hay solución inmediata, pero puedes apoyarte en las funciones mencionadas, o hacer el cálculo tu mismo:
Código Delphi [-]
var f1, f2 : TDatetime;
      h,m,s:word;
begin
 
s := seconsbetween(f1,f2);
h := s div 3600 ;
m := (s mod 3600) div 60; // el resto de la división anterior:
s := (s mod 3600) mod 60;

Edito:
El resultado no podrás codificarlo como una TTime, ni como TDateTime, ya que tiene el límite en 24 horas, por tanto, jamás podrás crear una hora con 26 horas.

Saludos


nuk3zito 16-12-2009 19:52:45

Cita:

Empezado por Vicente Ivan (Mensaje 348914)
ejemplo
sumarle 48 meses a una fecha
o 4 años a una fecha
sin tener que utilizar decode

No se si es pregunta o que... pero puedes utilizar IncMonth() o IncYear(), me parece que están en la unit DateUtils.

Saludos.

gonza_619 04-12-2010 00:30:37

al hacer la diferencia de hroas aparece asi ,
14:00:00 - 12:00:00 = 2.00 o algo asi

min:=minutesbetween(he,hs);
dec:=roundto(min/60,-1); en este caso reste 5:0:0 - 6:30:0 y dio dec:1,5
pero luego necesito que ese 1,5 vuelva a 1:30:00 pm o am, como seria? ya que "dec" es decimal y tengo q pasarlo a time. gracias!


La franja horaria es GMT +2. Ahora son las 20:48:12.

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