VB .NET  - Calculando a diferença entre duas datas : TimeSpan x DateDiff


 Neste artigo eu vou mostrar como podemos calcular a diferença entre duas datas usando a função DateDiff e a estrutura TimeSpan comparando os resultados e fazendo algumas considerações.

Como eu calculo a diferença entre duas datas ?

Esta é uma pergunta freqüente que tem a seguinte resposta : Depende ?

Depende do que ?

Depende do motivo pelo qual você esta calculando a data e que vai determinar a precisão do resultado.

Na linguagem VB .NET existem dois caminhos que você pode seguir para calcular a diferença entre datas:

  1. Usar a função DateDiff
  2. Usar a estrutura TimeSpan

Ambos os caminhos são válidos e eles têm funcionalidades que se sobrepõe mas cada um deles tem características específicas.

A despeito das suas similaridades a principal diferença entre os dois é que DateDiff é uma função, de forma que você precisa fazer a chamada da função a cada vez que você desejar obter um valor, ao passo que TimeSpan é uma estrutura que é criada uma vez e depois basta você usar os membros que você precisa.

Conceitos Básicos

1- DateDiff -  Retorna um valor do tipo Long que especifica o número de intervalos de tempo entre os dois valores tipo Date.

Sintaxe:

Public Overloads Function DateDiff( _
    ByVal Interval As [ DateInterval | String ], _
    ByVal Date1 As DateTime, _
    ByVal Date2 As DateTime, _
    Optional ByVal DayOfWeek As FirstDayOfWeek = FirstDayOfWeek.Sunday, _
    Optional ByVal  WeekOfYear As FirstWeekOfYear = FirstWeekOfYear.Jan1 _
) As Long

Parâmetros:

Interval Obrigatório. Valor de enumeração DateInterval ou expressão String representando o intervalo de tempo que você deseja utilizar como a unidade de diferença entre Date1 e Date2.
Date1 Obrigatório. Date . A primeira data/hora que você deseja usar no cálculo.
Date2 Obrigatório. Date . O segundo valor de data/hora que você deseja usar no cálculo.
DayOfWeek Opcional. Um valor escolhido da enumeração FirstDayOfWeek que especifica o primeiro dia da semana. Se não especificado, FirstDayOfWeek.Sunday é usado.
WeekOfYear Opcional. Um valor escolhido da enumeração FirstWeekOfYear que especifica o primeiro dia da semana. Se não especificado, FirstWeekOfYear.Jan1 é usado.

DateDiff subtrai o valor de Date1 para Date2 resultando a diferença entre eles. Nenhum valor é alterado no programa de chamada.

2- TimeSpan - Representa um intervalo de tempo

Sintaxe :

Public Structure TimeSpan _
	Implements IComparable, IComparable(Of TimeSpan),  _
	IEquatable(Of TimeSpan), IFormattable

Um objeto de TimeSpan representa um intervalo de tempo (duração de tempo ou de tempo decorrido) que é medido como um número positivo ou negativo de dias, de horas, de minutos, de segundos, e de frações de um segundo. A estrutura de TimeSpan também pode ser usada para representar a hora do dia, mas somente se a hora não estiver relacionada a uma determinada data. Caso contrário, DateTime ou a estrutura DateTimeOffset devem ser usadas.

Recursos Usados :

Criando o projeto no Visual Studio 2013 Express for Windows Desktop

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual C# e o template Windows Forms Application;

Informe o nome Eventos e clique no botão OK;

A seguir selecione o  formulário padrão form1.vb e inclua, a partir da ToolBox, os seguintes controles:

Disponha os controles no formulário conforme a figura abaixo:

No evento Click do botão de comando - btnCalcular - inclua o código abaixo:

 Private Sub btnCalcular_Click(sender As Object, e As EventArgs) Handles btnCalcular.Click
        Dim dtini As DateTime = dtpini.Value
        Dim dtfim As DateTime = dtpfim.Value
        'TimeSpan
        Dim dif As TimeSpan = dtfim.Subtract(dtini)
        txtResultado.Text = dif.TotalSeconds.ToString + "  Segundos" + vbCrLf
        txtResultado.Text += dif.TotalMinutes.ToString + "  Minutos " + vbCrLf
        txtResultado.Text += dif.TotalHours.ToString + "  Horas " + vbCrLf
        txtResultado.Text += dif.TotalDays.ToString + "  Dias " + vbCrLf
        'DateDiff
        txtResultado2.Text = DateDiff(DateInterval.Second, dtini, dtfim).ToString + "  Segundos" + vbCrLf
        txtResultado2.Text += DateDiff(DateInterval.Minute, dtini, dtfim).ToString + "  Minutos" + vbCrLf
        txtResultado2.Text += DateDiff(DateInterval.Hour, dtini, dtfim).ToString + " Horas" + vbCrLf
        txtResultado2.Text += DateDiff(DateInterval.Day, dtini, dtfim).ToString + "  Dias" + vbCrLf
        txtResultado2.Text += DateDiff(DateInterval.Quarter, dtini, dtfim).ToString + "  Trimestres" + vbCrLf
        txtResultado2.Text += DateDiff(DateInterval.Month, dtini, dtfim).ToString + "  Meses" + vbCrLf
    End Sub

O código em si é muito simples e dispensa comentários.

Executando o projeto iremos obter o seguinte resultado:

Os valores fracionários devolvidos a partir das propriedades do TimeSpan são mais significativos do que possam parecer à primeira vista; cada uma dessas propriedades está retornando a diferença total entre as duas datas, enquanto que os números inteiros retornados por DateDiff apenas fornecem um valor dentro de um intervalo (dia, hora, etc.).

Usando apenas uma dessas propriedades de TimeSpan, seria possível descobrir qualquer outro intervalo de tempo (com diferentes graus de precisão), embora esse cálculo seja raramente exigido na prática.

A estrutura TimeSpan fornece membros adicionais (.Hours, .Days, etc.) que retornam valores mais precisos do que você obtêm usando DateDiff.

Enquanto que TimeSpan aparenta ter mais recursos e ser mais eficiente, DateDiff tem duas vantagens que podem pesar no momento de você decidir qual deles usar.

  1. Oferece vários intervalos de datas que não são cobertos pelo TimeSpan, incluindo Semanas(Weeks) e Trimestres (Quarters);

  2. É compatível com a função DateDiff do Visual Basic 6 o que lhe permite reutilizar mais facilmente o código existente;

Pegue o projeto completo aqui:  Calcular_Diferenca_Datas.zip

    Lucas 9:23 E dizia a todos : Se alguém quer vir após mim, negue-se a si mesmo, e tome cada dia sua cruz, e siga-me.
    Lucas 9:24 Porque, qualquer que quiser salvar a sua vida, perdê-la-á; mas qualquer que, por amor de mim, perder a sua vida, a salvará.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti