Converter valor numérico para hora em AdvPL

Olá pessoal…

Visto a necessidade de converter um valor numérico para o padrão de horas (HH:MM) em AdvPL, desenvolvi uma rotina genérica que visa suprir essa necessidade.


Para utilizá-la é bem simples, basta chamar a rotina passando o primeiro parâmetro o valor numérico, e o segundo o caracter de separação (como ‘h’ ou ‘:’), por exemplo, se eu quero mostrar 13h45, teria que fazer u_zVal2Hora(13.45, ‘h’).

Alert da execução da rotina

Alert da execução da rotina

Abaixo o código fonte utilizado:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zVal2Hora
Converte valor numérico (ex.: 15.30) para hora (ex.: 15:30)
@author Atilio
@since 20/09/2014
@version 1.0
	@param [nValor], Numérico, Valor numérico correspondente as horas
	@param [cSepar], Caracter, Caracter de separação (ex.: 'h', ':', etc)
	@return cHora, Variável que irá armazenar as horas
	@example
	u_zVal2Hora(1.50, 'h') //01h30
	u_zVal2Hora(1.50, ':') //01:30
/*/
 
User Function zVal2Hora(nValor, cSepar)
	Local cHora := ""
	Local cMinutos := ""
	Default cSepar := ":"
	Default nValor := -1
	
	//Se for valores negativos, retorna a hora atual
	If nValor < 0
		cHora := SubStr(Time(), 1, 5)
		cHora := StrTran(cHora, ':', cSepar)
		
	//Senão, transforma o valor numérico
	Else
		cHora := Alltrim(Transform(nValor, "@E 99.99"))
		
		//Se o tamanho da hora for menor que 5, adiciona zeros a esquerda
		If Len(cHora) < 5
			cHora := Replicate('0', 5-Len(cHora)) + cHora
		EndIf
		
		//Fazendo tratamento para minutos
		cMinutos := SubStr(cHora, At(',', cHora)+1, 2)
		cMinutos := StrZero((Val(cMinutos)*60)/100, 2)
		
		//Atualiza a hora com os novos minutos
		cHora := SubStr(cHora, 1, At(',', cHora))+cMinutos
		
		//Atualizando o separador
		cHora := StrTran(cHora, ',', cSepar)
	EndIf
	
	ConOut("> zVal2Hora: "+cHora)
Return cHora

Update 26/10/2015: Conforme dica do usuário Caio, alterei o calculo da hora, onde agora é proporcional conforme os minutos (por exemplo, valor 50 equivale a 30 minutos).

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação