none
Calcular "tempo de serviço" (# anos, # meses e # dias) RRS feed

  • Pergunta

  • Boa tarde.

    Estou tentando fazer o seguinte:

    Um funcionário com data de admissão = 20/12/2000 tem 11 anos, 9 meses e 20 dias de serviço prestado. 

    Preciso codificar isso, porém, o que estou fazendo, quando coloco esta data de admissão, me retorna:

    12 anos, -2 meses e -10 dias

    Eu sei o porque acontece, que é o fato de ele calcular separadamente os anos, meses e dias, porém, não sei o que fazer para resolver rs.

    Segue código:

                            private void btCalcular_Click(object sender, EventArgs e)
            {
                Int32 anos, meses, dias;
                String tempoServico;
                if (dtpFim.Value == null)
                {
                    DateTime span = Convert.ToDateTime(DateTime.Today.Subtract(dtpInicio.Value));
                    tempoServico = span.Year.ToString() + " ano(s), " + span.Month.ToString() + " mes(es), " + span.Day.ToString() + " dia(s)";
                    tbTempoCargo.Text = tempoServico;
                }

    Abraços

    quarta-feira, 10 de outubro de 2012 16:20

Respostas

  • Leonardo, 

    O Código que o Peterson mandou vai funcionar, acredito eu que só falte você subtrair do ano e do mes o valor 1, pois como o DateTime conta apartir da data 1/1/1, você sempre estará 1 mes e 1 ano a frente


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 10 de outubro de 2012 18:03
  • Leonardo,

    Fiz uma adaptação no código:

                DateTime DataInicio = new DateTime(2000, 12, 20);
                DateTime dataTermino = DateTime.Today;
                TimeSpan tempoCalculado = dataTermino.Subtract(DataInicio.AddYears(1).AddMonths(1).AddDays(1));
                DateTime dataCalculada = new DateTime(tempoCalculado.Ticks);
                Console.WriteLine("Tempo desde o Inicio: {0} Ano(s), {1} Mes(es), {2} dia(s)", dataCalculada.Year, dataCalculada.Month, dataCalculada.Day);
    

    Sei que parece estranho adicionar um ano, um mes e um dia, mas existe uma lógica.

    A varável do tipo DateTime sempre inicia em "01/01/0001", por isso quando se usa o método "FromTicks", ele acresce a partir desta data.

    O resultado do novo código é considerando o dia atual, se quiser desconsiderar, em AddDays utilize como parâmetro o valor 2.


    Peterson Roberto Oliveira Seridonio
    Desenvolvedor C#
    MCTS Windows 7

    quarta-feira, 10 de outubro de 2012 19:55

Todas as Respostas

  • Olá Leonardo,

    Veja se isso te ajuda.

                DateTime DataInicio = new DateTime(2000, 12, 20);
                TimeSpan tempoCalculado = DateTime.Now.Subtract(DataInicio);
                DateTime dataCalculada= new DateTime(tempoCalculado.Ticks);
                Console.WriteLine("Tempo desde o Inicio: {0} Ano(s), {1} Mes(es), {2} dia(s)", dataCalculada.Year, dataCalculada.Month,dataCalculada.Day);
    


    Peterson Roberto Oliveira Seridonio
    Desenvolvedor C#
    MCTS Windows 7

    • Sugerido como Resposta Guilherme da Luz quarta-feira, 10 de outubro de 2012 19:51
    quarta-feira, 10 de outubro de 2012 17:57
  • Leonardo, 

    O Código que o Peterson mandou vai funcionar, acredito eu que só falte você subtrair do ano e do mes o valor 1, pois como o DateTime conta apartir da data 1/1/1, você sempre estará 1 mes e 1 ano a frente


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 10 de outubro de 2012 18:03
  • A conta está dando um resultado errado Peterson:

    Ao invés do correto que é 11 anos, 9 meses e 20 dias, ele mostra: 12 anos, 10 meses e 22 dias. Sendo a data inicio 20/12/2000

    quarta-feira, 10 de outubro de 2012 18:13
  • Leonardo,

    Fiz uma adaptação no código:

                DateTime DataInicio = new DateTime(2000, 12, 20);
                DateTime dataTermino = DateTime.Today;
                TimeSpan tempoCalculado = dataTermino.Subtract(DataInicio.AddYears(1).AddMonths(1).AddDays(1));
                DateTime dataCalculada = new DateTime(tempoCalculado.Ticks);
                Console.WriteLine("Tempo desde o Inicio: {0} Ano(s), {1} Mes(es), {2} dia(s)", dataCalculada.Year, dataCalculada.Month, dataCalculada.Day);
    

    Sei que parece estranho adicionar um ano, um mes e um dia, mas existe uma lógica.

    A varável do tipo DateTime sempre inicia em "01/01/0001", por isso quando se usa o método "FromTicks", ele acresce a partir desta data.

    O resultado do novo código é considerando o dia atual, se quiser desconsiderar, em AddDays utilize como parâmetro o valor 2.


    Peterson Roberto Oliveira Seridonio
    Desenvolvedor C#
    MCTS Windows 7

    quarta-feira, 10 de outubro de 2012 19:55
  • Simplesmente perfeito!
    Muitíssimo obrigado, principalmente ao Peterson e ao Bruno pela prestatividade.

    Valeu rapaziada!

    quarta-feira, 10 de outubro de 2012 20:05