Jump to content
Fivewin Brasil

Calculo de Horas


Luiz Fernando

Recommended Posts

Pessoal estou quebrando a cabeça para calcular a quantidade de horas de um periodo, a funcao abaixo peguei a um tempo atrás no forum do pctoledo funciona certinho, mais preciso agora saber o total de horas de um determinado numero de dias mais somente das 23:59 as 11:59hs,se alguem ja vez alguma coisa parecida e poder me orientar ficaria agradecido...


function intervalo(d1,h1,d2,h2)

priv d:=0,h:=0,m:=0,s,si

si=iif(d2>d1 .or. (d2=d1 .and. h2>h1),1,0)

h1=(val(left(h1,2))*60)+val(right(h1,2))

h2=(val(left(h2,2))*60)+val(right(h2,2))

if si=1

d2=((d2-d1)*14400)+h2

d1=h1

s=d2-d1

else

d1=((d1-d2)*1440)+h1

d2=h2

s=d1-d2

endif

do while .t.

if s>59

if (s/60)>24

d=int(s/60/24)

s=s-(d*24*60)

else

h=int(s/60)

s=s-(h*60)

if h=24

h=0

d=d+1

endif

endif

else

m=s

exit

endif

enddo

s=iif((d+h+m)=0,"",iif(si=0,"-","+"))

retu s+alltrim(str(d))+","+strzero(h,2)+":"+strzero(m,2)

id=code>id=code>

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

Pessoal estou quebrando a cabeça para calcular a quantidade de horas de um periodo, a funcao abaixo peguei a um tempo atrás no forum do pctoledo funciona certinho, mais preciso agora saber o total de horas de um determinado numero de dias mais somente das 23:59 as 11:59hs,se alguem ja vez alguma coisa parecida e poder me orientar ficaria agradecido...


function intervalo(d1,h1,d2,h2)

priv d:=0,h:=0,m:=0,s,si

si=iif(d2>d1 .or. (d2=d1 .and. h2>h1),1,0)

h1=(val(left(h1,2))*60)+val(right(h1,2))

h2=(val(left(h2,2))*60)+val(right(h2,2))

if si=1

d2=((d2-d1)*14400)+h2

d1=h1

s=d2-d1

else

d1=((d1-d2)*1440)+h1

d2=h2

s=d1-d2

endif

do while .t.

if s>59

if (s/60)>24

d=int(s/60/24)

s=s-(d*24*60)

else

h=int(s/60)

s=s-(h*60)

if h=24

h=0

d=d+1

endif

endif

else

m=s

exit

endif

enddo

s=iif((d+h+m)=0,"",iif(si=0,"-","+"))

retu s+alltrim(str(d))+","+strzero(h,2)+":"+strzero(m,2)

id=code>id=code>

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

ENTRADA_MANHA="07:00:00"

SAIDA_MANHA="11:00:00"

ENTRADA_TARDE="13:00:00"

SAIDA_TARDE="18:00:00"

hora1 = segundos (ENTRADA_MANHA)

hora2 = segundos (SAIDA_MANHA)

d_hora1 = hora2 - hora1

hora3 = segundos (ENTRADA_TARDE)

hora4 = segundos (SAIDA_TARDE)

d_hora2 = hora4 - hora3

final = d_hora1 + d_hora2 // TOTAL DE 9HORAS

//==========================

function segundos

parameters tempo

final=val(left(tempo,2))*3600 + val(substr(tempo,4,2))*60 + val(substr(tempo,7,2))

return (final)

Viol

xDev Studio v0.65

xHB build 0.99.50

BCC 5.5.1

FW 2.6

Link to comment
Share on other sites

E ai Viol blz, colega nao é exatamente isto que estou querendo, o que eu preciso e achar o numero de horas somando varios dias mais de uma determinada faixa de horario.

EX:

data1=12/11/2007

time1=12:00hs

data2=25/11/2007

time2=14:00hs

Nesta faixa de data e hora preciso saber o total de horas apennas das 23:59 as 11:59.

Obs: Viol vc no msn e aqui no forum fazendo papel de programador velhinho, rapaz vc é muito novo ainda...Abracos

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

Guest johnson

e rapa cai um for next ai nao?

for 1 to ndias

funcao do amigo lah em cima somando as horas das horas

next

iiiiiii

Johnson Lôbo

Fortaleza-Ce

Fwh-2.5 xHarbour 0.99.3 e VeRCEv4

johnson@oi.com.br

Link to comment
Share on other sites

Pessoal valeu pela intenção mais o que estou precisando saber nao é saber a qtd de hora baeada em duas horas ou duas datas mais apenas uma faixa durante 24 horas, de varios dias...mais vlw pela intenção...

Abracos

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

Luis,

Paga aí a função INTERVALO(), com exemplo e tudo:

***********************************************************

#Include "Fivewin.ch"

//-------------------------------------------------------------

Function Main()

Set Date fren

set century on

dData1 := CtoD("01/11/2007")

dData2 := CtoD("03/11/2007")

cHora1 := "21:00:00"

cHora2 := "10:32:10"

cInter := Intervalo( dData1, dData2, cHora1, cHora2 )

MsgInfo( cInter )

//--------------------------------------------------------------

Function Intervalo( dData1, dData2, cHora1, cHora2 )

local nDias := dData2-dData1

local nHoras, nSec1, nSec2, nSobra, cH, cM, cS

nSec1 := Segundos( cHora1 )

nSec2 := Segundos( cHora2 )

if nSec1 > nSec2

nDias--

endif

nSobra := Segundos("24:00:00")-nSec1 + nSec2

cH := Alltrim(str( nDias*24+int(nSobra/3600) ) )

cM := StrZero( int( nSobra%3600/60 ), 2 )

cS := StrZero( int( nSobra%3600%60 ), 2 )

Return cH+":"+cM+":"+cS

//--------------------------------------------------------------

Function Segundos( cHora )

Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) )

************************************************************

Ricardo Marques

VRMM-Visual Fivewin

Link to comment
Share on other sites

Luiz,

Pequena correção na função INTERVALO(). Pega aí:

************************************************************

#Include "Fivewin.ch"

//-------------------------------------------------------------

Function Main()

Set Date fren

set century on

dData1 := CtoD("01/11/2007")

dData2 := CtoD("03/11/2007")

cHora1 := "21:00:00"

cHora2 := "21:30:00"

cInter := Intervalo( dData1, dData2, cHora1, cHora2 )

MsgInfo( cInter )

//--------------------------------------------------------------

Function Intervalo( dData1, dData2, cHora1, cHora2 )

local nDias := dData2-dData1

local nHoras, nSec1, nSec2, nSobra, cH, cM, cS

nSec1 := Segundos( cHora1 )

nSec2 := Segundos( cHora2 )

if nSec1 > nSec2

nDias--

nSobra := Segundos("24:00:00")-nSec1 + nSec2

else

nSobra := nSec2 - nSec1

endif

cH := Alltrim(str( nDias*24+int(nSobra/3600) ) )

cM := StrZero( int( nSobra%3600/60 ), 2 )

cS := StrZero( int( nSobra%3600%60 ), 2 )

Return cH+":"+cM+":"+cS

//--------------------------------------------------------------

Function Segundos( cHora )

Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) )

**********************************************************

Ricardo Marques

VRMM-Visual Fivewin

Link to comment
Share on other sites

olá ricardo blz, acho que não consegui me expressar direito aqui o que quero, eu trabalho com programa de motel,existe uma tabela de horario, mais a opção pernoite que começa a contar a partir das 23:59 até as 11:59, então um exemplo, o Pedro entrou no motel no dia 25/11 as 14:00hs, e saiu tres dias depois as 16:00hs preciso saber o total de horas mais sem somar o intervalo da pernoite...

Abracos

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

Agora intidí:

Pega aí então:

************************************************************

#Include "Fivewin.ch"

//-------------------------------------------------------------

Function Main()

Set Date fren

set century on

dData1 := CtoD("01/11/2007")

dData2 := CtoD("02/11/2007")

cHora1 := "22:59:00"

cHora2 := "12:00:00"

cIniPer := "23:59:00"

cFimPer := "11:59:00"

cInter := Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer )

MsgInfo( cInter )

//--------------------------------------------------------------

Function Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer )

local cH, cM, cS

local nTot := 0

do while dData1 <= dData2

if dData1 < dData2

if Segundos( cHora1 ) <= Segundos( cIniPer ).and. Segundos( cHora1 ) >= Segundos( cFimPer )

nTot += Segundos( cIniPer ) - Segundos( cHora1 )

endif

cHora1 := cFimPer

else

if Segundos( cHora1 ) > Segundos( cFimPer )

nTot += Segundos( cHora2 ) - Segundos( cHora1 )

else

if Segundos( cHora2 ) > Segundos( cFimPer )

nTot += Segundos( cHora2 ) - Segundos( cFimPer )

endif

endif

endif

dData1++

enddo

cH := Alltrim(str( Int(nTot/3600) ) )

cM := StrZero( int( nTot%3600/60 ), 2 )

cS := StrZero( int( nTot%3600%60 ), 2 )

Return cH+":"+cM+":"+cS

//--------------------------------------------------------------

Function Segundos( cHora )

Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) )

***********************************************************

O "Pedro" entrou uma hora antes do inicio do pernoite e saiu um minuto depois... deu "01:01:00".

Testei aqui o exemplo acima e deu blz. Se entrar e sair das 23:59 enm diante e sair até às 11:59 dá zero. Se sair dois dias depois às 11:59 dá 12 horas... se sair dois dias depois às 13:59 dá 14 horas. Se entrar 1 hora ante do inicio do pernoite e sair no dia seguinte 1 hora depois do fim, dá 2 horas... e bla! bla! bla!.

Testa aí e vê se é isso mesmo que você quer..

Ricardo Marques

VRMM-Visual Fivewin

Link to comment
Share on other sites

citação:

Agora intidí:

Pega aí então:

************************************************************

#Include "Fivewin.ch"

//-------------------------------------------------------------

Function Main()

Set Date fren

set century on

dData1 := CtoD("01/11/2007")

dData2 := CtoD("02/11/2007")

cHora1 := "22:59:00"

cHora2 := "12:00:00"

cIniPer := "23:59:00"

cFimPer := "11:59:00"

cInter := Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer )

MsgInfo( cInter )

//--------------------------------------------------------------

Function Intervalo( dData1, dData2, cHora1, cHora2, cIniPer, cFimPer )

local cH, cM, cS

local nTot := 0

do while dData1 <= dData2

if dData1 < dData2

if Segundos( cHora1 ) <= Segundos( cIniPer ).and. Segundos( cHora1 ) >= Segundos( cFimPer )

nTot += Segundos( cIniPer ) - Segundos( cHora1 )

endif

cHora1 := cFimPer

else

if Segundos( cHora1 ) > Segundos( cFimPer )

nTot += Segundos( cHora2 ) - Segundos( cHora1 )

else

if Segundos( cHora2 ) > Segundos( cFimPer )

nTot += Segundos( cHora2 ) - Segundos( cFimPer )

endif

endif

endif

dData1++

enddo

cH := Alltrim(str( Int(nTot/3600) ) )

cM := StrZero( int( nTot%3600/60 ), 2 )

cS := StrZero( int( nTot%3600%60 ), 2 )

Return cH+":"+cM+":"+cS

//--------------------------------------------------------------

Function Segundos( cHora )

Return ( Val(Left(cHora, 2))*3600 + Val(SubStr(cHora, 4,2))*60 + Val(Right(cHora,2)) )

***********************************************************

O "Pedro" entrou uma hora antes do inicio do pernoite e saiu um minuto depois... deu "01:01:00".

Testei aqui o exemplo acima e deu blz. Se entrar e sair das 23:59 enm diante e sair até às 11:59 dá zero. Se sair dois dias depois às 11:59 dá 12 horas... se sair dois dias depois às 13:59 dá 14 horas. Se entrar 1 hora ante do inicio do pernoite e sair no dia seguinte 1 hora depois do fim, dá 2 horas... e bla! bla! bla!.

Testa aí e vê se é isso mesmo que você quer..

Ricardo Marques

VRMM-Visual Fivewin


id=quote>id=quote>

Ricardo fantástico esta sua função, deu certinho aqui, muito obrigado mesmo...

Obs: Vc tem que conversar com o Jose Carlos para que no ano que vem apresentar sua VRMM UNION no congresso.

Abracos

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FW 24,CLIPPER5 5.3e,CDX,WS,BLINKER 7.0

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...