Ir para conteúdo
Fórum Script Brasil
  • 0

conversão de hora ...?


vilmarbr

Pergunta

Oi pessoal,

Tentei montar este esquema aqui para formatar uma hora em formato decimal no formato hh:mm:ss, resultado de uma conversão de horário em segundos, conforme pode ver no teste abaixo (este horário em segundos vem de uma soma de vários tempos em segundos), mas num deu certo :(

quando. a parte decimal tem menos de 4 posições dá zica :(

Já tentei usar as funções Instr e Mid, mas tb num deu certo !!

Algum esquema mais fácil pra se fazer isto ???

Grato.

Dim dblHoraTotal            As Double  'Hora total com parte decimal. Exemplo: 22.78
    Dim intHora                 As Integer 'Hora sem parte decimal. Exemplo: 22
    Dim dblHoraParteDecimal     As Double  'Parte decimal da hora. Exemplo: 0.78
    
    Dim dblMinutoTotal          As Double
    Dim intMinuto               As Integer
    Dim dblMinutoParteDecimal   As Double
    
    Dim dblSegundoTotal          As Double
    Dim intSegundo               As Integer
    Dim dblSegundoParteDecimal   As Double

    Dim strHoraFormatada        As String 'Hora formatada hh:mm:ss. Exemplo: 22:
    'Pega parte da hora
    dblHoraTotal = Round(81999 / 3600, 2)
    intHora = CStr(Int(dblHoraTotal))
    dblHoraParteDecimal = Val("0." & Right(dblHoraTotal, 2))
    
    'Pega parte do minuto
    dblMinutoTotal = Round(dblHoraParteDecimal * 60, 2)
    intMinuto = CStr(Int(dblMinutoTotal))
    dblMinutoParteDecimal = Val("0." & Right(dblMinutoTotal, 2))
    
    'Pega parte do segundo
    dblSegundoTotal = Round(dblMinutoParteDecimal * 60, 2)
    intSegundo = CStr(Int(dblSegundoTotal))
    dblSegundoParteDecimal = Val("0." & Right(dblSegundoTotal, 2))

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

kuroi, valeu pela dica.

ficou meio que parecido com solução que conseguido chegar antes da sua dica, veja:

Option Explicit

Private Sub Form_Load()

Dim dblHoraTotal As Double 'Hora total com parte decimal.

Dim intHora As Integer 'Hora sem a parte decimal

Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos

Dim dblMinutoTotal As Double 'Minuto total com parte decimal.

Dim intMinuto As Integer 'Minuto sem a parte decimal

Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos

Dim dblSegundoTotal As Double 'Segundo total com parte decimal.

Dim intSegundo As Integer 'Segundo sem a parte decimal

Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos

Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22:

'Pega parte da hora

dblHoraTotal = 81999 / 3600 'Este valor poderia estar vindo de uma série somas de várias operacões calculadas em segundo

intHora = Int(dblHoraTotal)

intRestoSegundoHora = 8199 Mod 3600

'Pega parte do minuto

If intRestoSegundoHora > 60 Then

dblMinutoTotal = intRestoSegundoHora / 60

intMinuto = Int(dblMinutoTotal)

intRestoSegundoMinuto = intRestoSegundoHora Mod 60

'Pega parte do segundo

If intRestoSegundoMinuto > 60 Then

dblSegundoTotal = intRestoSegundoMinuto / 60

intSegundo = Int(dblSegundoTotal)

intRestoSegundo = intRestoSegundoMinuto Mod 60

Else

intSegundo = intRestoSegundoMinuto

End If

Else

intMinuto = intRestoSegundoHora

intSegundo = 0

End If

'Hora no formato hh:mm:ss

strHoraFormatada = CStr(intHora) & ":" & CStr(intMinuto) & ":" & CStr(intSegundo)

Debug.Print strHoraFormatada '22:16:39

End Sub

obrigado pela ajuda.

obs.: eu precisei de todo este artifício, pois recebo um valor total resultado da soma de várias operações em segundos.

e ficar mostrando pro usário "todas as operações demoraram 89999 segundos" nunca muito conclusivo né :P

abç

Link para o comentário
Compartilhar em outros sites

  • 0

Kuroi, acabei de transformar a minha rotina numa função e comparei a com a sua, o resultado deu diferente.......

Hora Formatada - Função 1: 22:16:39 '>> Minha Rotina

Hora Formatada - Função 2: 0:00:22,7775 '>> Sua Rotina

(81999 / 3600) = 22,7775

Fato que implica em termos no mínimo 22 horas.

Na sua rotina apontam apenas 22 segundos e 7775 milisegundos :unsure: :rolleyes:

Veja testes:

Option Explicit

Private Sub Form_Load()

'Este valor (81999 / 3600) poderia estar vindo de uma série somas de várias operacões calculadas em segundo

Debug.Print "Hora Formatada - Função 1: " & FormatarHora_hh_mm_ss(81999 / 3600)

Debug.Print "Hora Formatada - Função 2: " & MontaHora(81999 / 3600)

End Sub

Public Function FormatarHora_hh_mm_ss(dblSegundos As Double) As String

Dim dblHoraTotal As Double 'Hora total com parte decimal.

Dim intHora As Integer 'Hora sem a parte decimal

Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos

Dim dblMinutoTotal As Double 'Minuto total com parte decimal.

Dim intMinuto As Integer 'Minuto sem a parte decimal

Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos

Dim dblSegundoTotal As Double 'Segundo total com parte decimal.

Dim intSegundo As Integer 'Segundo sem a parte decimal

Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos

Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22:

'Pega parte da hora

dblHoraTotal = dblSegundos

intHora = Int(dblHoraTotal)

intRestoSegundoHora = 8199 Mod 3600

'Pega parte do minuto

If intRestoSegundoHora > 60 Then

dblMinutoTotal = intRestoSegundoHora / 60

intMinuto = Int(dblMinutoTotal)

intRestoSegundoMinuto = intRestoSegundoHora Mod 60

'Pega parte do segundo

If intRestoSegundoMinuto > 60 Then

dblSegundoTotal = intRestoSegundoMinuto / 60

intSegundo = Int(dblSegundoTotal)

intRestoSegundo = intRestoSegundoMinuto Mod 60

Else

intSegundo = intRestoSegundoMinuto

End If

Else

intMinuto = intRestoSegundoHora

intSegundo = 0

End If

'Hora no formato hh:mm:ss

strHoraFormatada = IIf(Len(CStr(intHora)) = 1, "0", "") & CStr(intHora) & ":" _

& IIf(Len(CStr(intMinuto)) = 1, "0", "") & CStr(intMinuto) & ":" _

& IIf(Len(CStr(intSegundo)) = 1, "0", "") & CStr(intSegundo)

FormatarHora_hh_mm_ss = strHoraFormatada

End Function

Public Function MontaHora(dblSegundo As Double) As String

Dim dblHora As Double

Dim dblMinuto As Double

If dblSegundo < 0 Then

MontaHora = "- "

dblSegundo = Abs(dblSegundo)

Else

MontaHora = ""

End If

dblHora = dblSegundo \ 3600

dblSegundo = dblSegundo - (dblHora * 3600)

dblMinuto = dblSegundo \ 60

dblSegundo = dblSegundo - (dblMinuto * 60)

MontaHora = MontaHora & dblHora & ":" _

& IIf(Len(CStr(dblMinuto)) = 1, "0", "") & dblMinuto & ":" _

& IIf(Len(CStr(dblSegundo)) = 1, "0", "") & dblSegundo

End Function

Link para o comentário
Compartilhar em outros sites

  • 0

é kuori você está certo, ehheehe, eu que não prestei muita atenção... é fogo, fazer uma coisa e pensando em outra.

estou testando a sua função passando segundos e mudei a minha para passar segundo tb.

a minha ainda tá dando um valor um pouco diferente:

Hora Formatada - Função 1: 22:00:23 --> minha

Hora Formatada - Função 2: 22:46:39 --> sua

estou fuçando aqui ainda para deixar redonda.

kori, só mais uma dúvida:

este operador que você usou \ (barra ao contrário) é o DIV (divisão inteira), certo ?

eu fiz uns testes aqui para usar: Num1 DIV Num2 e deu pau , como se não existisse tal operador.

porém usando: Num1 \ Num2 , não deu pau.

será que no VB 6 o operador DIV foi descontinuado ou é pau no VB 6 instalado no meu PC ???

obrigado pela paciência.

abç

Editado por vilmarbr
Link para o comentário
Compartilhar em outros sites

  • 0

Kori, agora os 2 resultados bateram igual, eheheh :D :lol: .

a sua rotina usando \ (div) .

a minha usando mod.

Veja Resultado:

Com valor grande: 81999

Hora Formatada - Função 1: 22:46:39 --> Minha

Hora Formatada - Função 2: 22:46:39 --> Sua

Com valor pequeno: 1999

Hora Formatada - Função 1: 00:33:19 --> Minha

Hora Formatada - Função 2: 00:33:19 --> Sua

Rotinas usadas num form:

Option Explicit

Private Sub Form_Load()

Debug.Print "Hora Formatada - Função 1: " & FormatarHora_hh_mm_ss(81999) '1999

Debug.Print "Hora Formatada - Função 2: " & MontaHora(81999) '1999

End Sub

Public Function FormatarHora_hh_mm_ss(dblHoraTotal As Double) As String

Dim intHora As Integer 'Hora sem a parte decimal

Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos

Dim intMinuto As Integer 'Minuto sem a parte decimal

Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos

Dim intSegundo As Integer 'Segundo sem a parte decimal

Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos

Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22:

'Pega parte da hora

intHora = Int(dblHoraTotal / 3600)

intRestoSegundoHora = dblHoraTotal Mod 3600

'Pega parte do minuto

intMinuto = Int(intRestoSegundoHora / 60)

intRestoSegundoMinuto = intRestoSegundoHora Mod 60

'Pega parte do segundo

intSegundo = intRestoSegundoMinuto Mod 60

'Hora no formato hh:mm:ss

strHoraFormatada = IIf(Len(CStr(intHora)) = 1, "0", "") & CStr(intHora) & ":" _

& IIf(Len(CStr(intMinuto)) = 1, "0", "") & CStr(intMinuto) & ":" _

& IIf(Len(CStr(intSegundo)) = 1, "0", "") & CStr(intSegundo)

FormatarHora_hh_mm_ss = strHoraFormatada

End Function

Public Function MontaHora(dblSegundo As Double) As String

Dim dblHora As Double

Dim dblMinuto As Double

If dblSegundo < 0 Then

MontaHora = "- "

dblSegundo = Abs(dblSegundo)

Else

MontaHora = ""

End If

'\ --> barra ao contrário é o operador matemático DIV, o qual retorna o resto de uma divisão inteira.

dblHora = dblSegundo \ 3600

dblSegundo = dblSegundo - (dblHora * 3600)

dblMinuto = dblSegundo \ 60

dblSegundo = dblSegundo - (dblMinuto * 60)

MontaHora = IIf(Len(CStr(dblHora)) = 1, "0", "") & dblHora & ":" _

& IIf(Len(CStr(dblMinuto)) = 1, "0", "") & dblMinuto & ":" _

& IIf(Len(CStr(dblSegundo)) = 1, "0", "") & dblSegundo

End Function

----

Valeu B)

Editado por vilmarbr
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0

legal.

será que no VB 6 o operador DIV foi descontinuado ou é pau no VB 6 instalado no meu PC ???

é o div eu sabia q tinha acho q no pascal. no visual basic eu sempre fazia a divisao normal e depois convertia. descobri q tinha o operador \ há um tempo atras.

Link para o comentário
Compartilhar em outros sites

  • 0
legal.
será que no VB 6 o operador DIV foi descontinuado ou é pau no VB 6 instalado no meu PC ???

é o div eu sabia q tinha acho q no pascal. no visual basic eu sempre fazia a divisao normal e depois convertia. descobri q tinha o operador \ há um tempo atras.

Ok kuroi, muito obrigado mais uma vez.

Abç.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...