none
Erro com formatação de horas RRS feed

  • Pergunta

  • Boa tarde

    Tenho um função que me retorna soma de horas, como minha soma tem valores altos em horas precisei fazer uma formação, o problema é que quando a hora ou o minuto vai de 0 - 9 ao invés de exibir 01 ou 09 por exemplo ele retira o 0. Preciso que sempre use as duas casas, vejam minha função:

    Public Function somaHoras(ByVal _horaPrincipal As String, ByVal _horaSubtrair As String) As String
        Dim horaSoma As TimeSpan
        Dim horaPrincipal As TimeSpan
        Dim quebraHora() As String
    
        quebraHora = _horaSubtrair.ToString.Split(":")
        horaSoma = New TimeSpan(quebraHora(0), quebraHora(1), quebraHora(2))
        quebraHora = _horaPrincipal.ToString.Split(":")
        horaPrincipal = New TimeSpan(quebraHora(0), quebraHora(1), quebraHora(2))
    
        horaPrincipal = horaPrincipal.Add(horaSoma)
        Return String.Format("{0}:{1}:{2}", Int(horaPrincipal.TotalHours), (horaPrincipal.Minutes), (horaPrincipal.Seconds.ToString("00")))
      End Function
    
    A linha do Return me traz os dados formatados, observem que na parte que pego os segundos eu usei .toString("00"), isso resolver por que no segundos ele me traz milisegundos, porém se faço isso nas horas ou nos minutos ele arredonda prejudicando meus calculos. Tem como resolver essa formatação?


    Alexandre
    sexta-feira, 1 de abril de 2011 14:07

Respostas

  • Você está fazendo coisa que não deve. Se a sua função é de somar horas, então você deve trabalhar com objetos TimeSpan, deve passar TimeSpan para a sua função. Com o TimeSpan vc soma um ao outro, o .Net faz a soma pra vc. E depois para formatar do jeito que vc quiser usa a função String.Format()

    Um erro que todo mundo comete quando está começando é querer trabalhar com data, horas e numero com objetos do tipo String, você deve lembrar q para trabalhar com esse dados, deve usar um objeto do tipo deles. Veja esse exemplo.

        private void Teste()
        {
          TimeSpan horaAtual = DateTime.Now.TimeOfDay;
          TimeSpan horaParaSomar = new TimeSpan(2, 5, 23);
          TimeSpan resultado = SomarHoras(horaAtual, horaParaSomar);
          string.Format("{0:hh\\:mm\\:ss}", resultado); //Saida Exemplo 15:36:15      
        }
    
        private TimeSpan SomarHoras(TimeSpan horaUm, TimeSpan horaDois)
        {
          return horaUm.Add(horaDois);
        }
    

     


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 5 de abril de 2011 02:10
  • Pois então usa a função TimeSpan.ParseExact("valor", "formato", Nothing) para converter o seu valor do que ficar separando eles.

    Para datas também vc consegue usar essa função.


    Quem sabe um dia os DataSets se extinguirão?
    quinta-feira, 7 de abril de 2011 17:33

Todas as Respostas

  • horaPrincipal.Seconds.ToString("00")

    ja tentou aplicar isso lá na casa das horas? Digo, se vc ta pedindo pra que os segundos sejam formatados com 2 casas, pq não joga isso na casa das horas também? e dos minutos...
    sexta-feira, 1 de abril de 2011 14:44
  • Uma melhor forma de retornar a string formatada do TimeSpan é a seguinte:

    Return Format("{0:HH:mm:ss}", New System.DateTime(seuTimeSpan.Ticks))

    Desta forma você economizará em código e utilizará uma formatação mais elegante.


    sexta-feira, 1 de abril de 2011 14:49
  • Opa blz

     

    Então Venilton estou tentando aqui mas esta apresentando o seguinte erro:

    A conversão da seqüência de caracteres '02/01/0001' no tipo 'Integer' não é válida.

    Estou enviando apenas horas na chamado dessa função. Como corrigir esse erro

    Public

     

    Function somaHoras(ByVal _horaPrincipal As String, ByVal _horaSubtrair As String) As

    String

     

    Dim horaSoma As

    TimeSpan

     

    Dim horaPrincipal As

    TimeSpan

     

    Dim quebraHora() As

    String

    quebraHora = _horaSubtrair.ToString.Split(

    ":"

    )

    horaSoma =

    New TimeSpan

    (quebraHora(0), quebraHora(1), quebraHora(2))

    quebraHora = _horaPrincipal.ToString.Split(

    ":"

    )

    horaPrincipal =

    New TimeSpan

    (quebraHora(0), quebraHora(1), quebraHora(2))

    horaPrincipal = horaPrincipal.Add(horaSoma)

     

    Return Format("{0:HH:mm:ss}", New System.DateTime

    (horaPrincipal.Ticks))

     

    End

    Function


    Alexandre
    segunda-feira, 4 de abril de 2011 13:51
  • Alexandre,

    O que exatamente você está precisando fazer? Explique melhor o que você deseja para ver se tem uma maneira mais simples de se fazer.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    segunda-feira, 4 de abril de 2011 16:03
    Moderador
  • Você está fazendo coisa que não deve. Se a sua função é de somar horas, então você deve trabalhar com objetos TimeSpan, deve passar TimeSpan para a sua função. Com o TimeSpan vc soma um ao outro, o .Net faz a soma pra vc. E depois para formatar do jeito que vc quiser usa a função String.Format()

    Um erro que todo mundo comete quando está começando é querer trabalhar com data, horas e numero com objetos do tipo String, você deve lembrar q para trabalhar com esse dados, deve usar um objeto do tipo deles. Veja esse exemplo.

        private void Teste()
        {
          TimeSpan horaAtual = DateTime.Now.TimeOfDay;
          TimeSpan horaParaSomar = new TimeSpan(2, 5, 23);
          TimeSpan resultado = SomarHoras(horaAtual, horaParaSomar);
          string.Format("{0:hh\\:mm\\:ss}", resultado); //Saida Exemplo 15:36:15      
        }
    
        private TimeSpan SomarHoras(TimeSpan horaUm, TimeSpan horaDois)
        {
          return horaUm.Add(horaDois);
        }
    

     


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 5 de abril de 2011 02:10
  • Até concordo com você em parte, o problema de estar levando na entrada da função os dados de hora como string é porque são dados que entra do usuário, por isso captura normalmente e depois converto, se você olhar na minha função eu recebo os valores converto eles quebrando e jogando em um timespam e depois somar normalemente com o timespam.

    Ou deveria ser feito de outra forma uma vez que os dados vem digitados pelo usuário?


    Alexandre
    quarta-feira, 6 de abril de 2011 16:03
  • Pois então usa a função TimeSpan.ParseExact("valor", "formato", Nothing) para converter o seu valor do que ficar separando eles.

    Para datas também vc consegue usar essa função.


    Quem sabe um dia os DataSets se extinguirão?
    quinta-feira, 7 de abril de 2011 17:33
  • Alexandre,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    sexta-feira, 27 de maio de 2011 12:28
    Moderador