C# - Calculando a diferença entre duas datas


  Hoje veremos como calcular a diferença entre duas datas usando a linguagem C#.

A utilização de informações de data e hora em aplicações usando a linguagem C# podem ser muito diversas e essas informações podem ser usadas de várias maneiras.

Só para você sentir o drama veja a seguir os usos mais comuns de informações de data e hora:

1 - Refletir apenas uma data, quando as informações sobre a hora não são importantes;
2 - Refletir apenas a hora, quando a data em si não é importante;
3 - Refletir uma data e hora abstratas que não estejam vinculadas a um horário e local específicos (por exemplo, a maioria das lojas em uma cadeia internacional abre nos dias da semana às 9:00 da manhã).
4 - Recuperar informações de data e hora de fontes externas ao .NET, normalmente onde as informações de data e hora são armazenadas em um tipo de dados simples.
5 - Identificar de forma exclusiva e inequívoca um único ponto no tempo. Alguns aplicativos exigem que uma data e hora não sejam ambíguas apenas no sistema host; outros exigem que seja inequívoco em todos os sistemas (isto é, uma data serializada em um sistema pode ser desserializada de forma significativa e usada em outro sistema em qualquer parte do mundo).
6 - Preservar vários horários relacionados (como a hora local do solicitante e o horário de recebimento do servidor para uma requisição da Web).
7 - Realizar aritmética de data e hora, possivelmente com um resultado que identifique de forma única e inequívoca um único ponto no tempo.

(fonte: https://docs.microsoft.com/en-us/dotnet/standard/datetime/choosing-between-datetime)

Isso posto, vamos ao nosso humilde projeto que calcula a diferença entre duas datas escolhidas.

Criando o  projeto no VS 2017 Community

Usando o Visual Studio 2017 Community no menu File clique em New Project;

A seguir selecione Visual C# -> Windows Desktop;

Selecione o template Windows Forms App(.NET Framework);

Informe um nome a seu gosto. Para o exemplo vou informar CShp_DifDatas;

No formulário Form1.cs inclua os seguintes controles a partir da ToolBox:

Disponha os controles conforme o leiaute da figura abaixo:

Agora vamos criar uma classe chamada CalculaDiferencaDatas() com o código conforme mostrado a seguir:

using System;
namespace CShp_DifDatas
{
    public class CalculaDiferencaDatas
    {
        /// <summary>
        /// definindo os números de dias em um mês; index 0=> janeiro e 11=> Dezembro
        /// fevereiro contém ou 28 ou 29 dias, por isso temos o valor -1
        /// o que iremos usar para calcular
        /// </summary>
        private int[] diasDoMes = new int[12] { 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        /// <summary>
        /// contém a data inicial
        /// </summary>
        private DateTime dataInicial;
        /// <summary>
        /// contém a data final
        /// </summary>
        private DateTime dataFinal;
        public CalculaDiferencaDatas(DateTime d1, DateTime d2)
        {
            int incremento;
            if (d1 > d2)
            {
                this.dataInicial = d2;
                this.dataFinal = d1;
            }
            else
            {
                this.dataInicial = d1;
                this.dataFinal = d2;
            }
            /// 
            /// Calculo dos dias
            /// 
            incremento = 0;
            if (this.dataInicial.Day > this.dataFinal.Day)
            {
                incremento = this.diasDoMes[this.dataInicial.Month - 1];
            }
            /// se for fevereiro
            /// se o dia for menor que o dia de  hoje
            if (incremento == -1)
            {
                if (DateTime.IsLeapYear(this.dataInicial.Year))
                {
                    // ano bissexto -> fevereiro contém 29 dias
                    incremento = 29;
                }
                else
                {
                    incremento = 28;
                }
            }
            if (incremento != 0)
            {
                Dias = (this.dataFinal.Day + incremento) - this.dataInicial.Day;
                incremento = 1;
            }
            else
            {
                Dias = this.dataFinal.Day - this.dataInicial.Day;
            }
            ///
            ///calculo do mês
            ///
            if ((this.dataInicial.Month + incremento) > this.dataFinal.Month)
            {
                this.Meses = (this.dataFinal.Month + 12) - (this.dataInicial.Month + incremento);
                incremento = 1;
            }
            else
            {
                this.Meses = (this.dataFinal.Month) - (this.dataInicial.Month + incremento);
                incremento = 0;
            }
            ///
            /// calculo do ano
            ///
            this.Anos = this.dataFinal.Year - (this.dataInicial.Year + incremento);
        }
        public override string ToString()
        {
            return this.Anos + " Anos(s), " + this.Meses + " mes(es), " + this.Dias + " dia(s)";
        }
        public int Anos { get; }
        public int Meses { get; }
        public int Dias { get; }
    }
}

A seguir vamos definir o código do formulário no evento Click do botão de comando btnCalculaDiferencaDatas e no evento FormClosed():

Executando o projeto e selecionando duas datas teremos o seguinte resultado:

Pegue o projeto aqui :   CShp_DifDatas.zip

"E, quanto fizerdes por palavras ou por obras, fazei tudo em nome do Senhor Jesus, dando por ele graças a Deus Pai."
Colossenses 3:17

Referências:


José Carlos Macoratti