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:
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:
1 DateTimePicker - dtp1
1 DateTimePicker - dtp2
1 Button - btnCalcular
2 TextBox - txtResultado e txtResultado2, Multiline = True
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.
Oferece vários intervalos de datas que não são cobertos pelo TimeSpan, incluindo Semanas(Weeks) e Trimestres (Quarters);
É 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: