Página 1 de 1

operacoes com horas

Enviado: 11 Set 2019 14:48
por elaineosm
boa tarde!

Estou trabalhando com horas e queria calcular o tempo decorrido entre uma hora e outra.
Usando a funcao timetosec(transform(hora2,"@R 99:99:00), transformo para segundos e depois
divido por 60 para transformar em minutos.

horaDigitada1 = 2300
horaDigitada1 = 0000

entrada = timetosec(transform(horaDigitada1,"@R 99:99:00) / 60
saida = timetosec(transform(horaDigitada2,"@R 99:99:00) / 60

duracao = horaDigitada2 - horaDigitada1 // duracao em minutos

Quando passa das 00h não funciona bem.

Alguem tem uma dica?

operacoes com horas

Enviado: 11 Set 2019 15:12
por Poka
Boa tarde

Código: Selecionar todos

/*
MODULO - F_HORAS.PRG
Roberto Oliveira (Poka)  Leme/SP
a entrada de horas tem que ser decimal
exemplos: 1,28

dif_horas( 22.30,14.25) = 15.55

*/
////////////////////////////
*-------- HORAS-----------------
FUNCT DIF_HORAS(XHORA1,XHORA2)
   // CALCULA O TEMPO
   // VERIFICA HORAS E MINUTOS
   LOCAL H1,H2,M1,M2,QTH:=0,QTM:=0
   LOCAL XTEMPO:=0

   // SE F RETORNA -1 , OU RETORNA O TEMPO DE HORAS
   IF ! F_HORA(XHORA1).OR. ! F_HORA(XHORA2)
     RETU (-1)
   ENDIF
   IF XHORA1=XHORA2
      XTEMPO:=0
   ELSEIF XHORA2 > XHORA1 // MESMO DIA
      H1:=INT(XHORA1)
      H2:=INT(XHORA2)
      M1:=1440- ( (INT(H1) *60) +    ((XHORA1-H1)*100 ))
      M2:=1440- ( (INT(H2) *60) +    ((XHORA2-H2)*100 ))
						QTM:=M1-M2
      XTEMPO:=MINUTOHORA( QTM)
   ELSE
			   // DIA DIEFERENTE (H2 MENOR QUE H1)
      M1:=1440- ( (INT(XHORA1) *60) +    ((XHORA1-INT(XHORA1))*100 ))
      // CALCULO M2 APOS MEIA NOITE
      M2:=(INT(XHORA2) *60) +    ((XHORA2-INT(XHORA2))*100 )
						QTM:= M1+M2
      XTEMPO:=MINUTOHORA( QTM)
			ENDIF

RETUR (XTEMPO)

/////////////
FUNCT HORAMINUTO(XHORA)
   // TRANSFOMA HORAS EM MINUTOS
   LOCAL X:=(INT(XHORA)*60)+ ( (XHORA-INT(XHORA))*100 )
RETUR (X)
/////////////
FUNCT MINUTOHORA(XMINUTO)
   LOCAL XH,XM , x
   // TRANSFOMA MINUTOS EM HORA
   XH:= INT(XMINUTO/60 )
   XM:=MOD(XMINUTO,60)/100
   X:=XH+XM
RETUR ( X)

/////////////
FUNCT F_MINUTO(XHORA)
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE OS MINUTOS SAO VALIDOS
   IF (XHORA-INT(XHORA)) *100 > 59
      RETU .F.
   ENDIF
RETUR .T.
//////////////////
FUNCT F_HORA(XHORA)
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE HORA E MINUTOS SAO VALIDOS
   IF XHORA>=24 .OR. (XHORA-INT(XHORA) ) *100 > 59
      RETU .F.
   ENDIF
RETUR .T.
///////////
FUNCT F_SOMAHORAS(XHORA1,XHORA2)
   LOCAL m1,m2,XTEMPO
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE HORA E MINUTOS SAO VALIDOS
   M1:= (INT(XHORA1) *60) +  (INT(XHORA2)*60)
   M2:=( (XHORA1- INT(XHORA1))*100)   + ( (XHORA2- INT(XHORA2))*100)
			QTM:=M1+M2

   XTEMPO:=MINUTOHORA( QTM)
RETUR XTEMPO
Poka

operacoes com horas

Enviado: 11 Set 2019 15:41
por elaineosm
O problema se dá quando passa para pernoite

ex:

hora inicial 23:00
hora final 00:00

o calculo da 1380 minutos

operacoes com horas

Enviado: 11 Set 2019 19:11
por Jairo Maia
Olá Pessoal,

Use ElapTime( cHoraIni, cHoraFim ) baseado em horário de 24 horas. Veja se ajuda:

Código: Selecionar todos

Function Main()
 Local cHoraInicial, cHoraFinal

 Clear Screen
 
 cHoraInicial := "11:00:00"
 cHoraFinal   := "01:00:00"

 ? ElapTime( cHoraInicial, cHoraFinal )  // retorna 14 horas

 cHoraInicial := "08:30:00"
 cHoraFinal   := "18:00:00"

 ?
 ? ElapTime( cHoraInicial, cHoraFinal )  // retorna 9 horas e meia
 ?
 
Return Nil