Bem, eu já tratei deste assunto nos artigos: Trabalhando com datas no Visual Basic e Visual Basic – Datas e o ano 2000. Por isto este artigo será bem direto e objetivo. Vou mostrar como fazer cálculos com datas. Antes de começar vou falar sobre uma função muito importante : DateSerial
DateSerial retorna um tipo de dado Variant (Date) para um ano , mês e dia especificado. Sua sintaxe é : DateSerial(year, month, day)
Seus argumentos são :
Parte |
Descrição |
year |
Obrigatório; Inteiro(Integer).Número entre 100 e 9999, ou uma expressão numérica |
month |
Obrigatório; Inteiro(Integer). Qualquer expressão numérica. |
day |
Obrigatório.Inteiro(Integer). Qualquer expressão numérica. |
Para definir uma data , como 31 de dezembro de 1991 , o intervalo de números para cada argumento da função deverá ser inserido no intervalo aceito por cada um deles. Assim para dias (day) o intervalo válido é de 1 a 31 , para mêses (month) o intervalo válido é de 1 a 12. Você também pode usar expressões numéricas para cada argumento . Então podemos fazer: DateSerial(1990 – 10, 8 – 2, 1 – 1) Esta função irá retornar uma data :
-
10 anos antes de 1990 ( 1990 – 10 )
-
2 meses antes de agosto ( 8 -2 )
-
um dia antes do primeiro dia ( 1 – 1 )
No argumento ano , valores entre 0 e 29 , são interpretados como para o intervalo de anos de 2000 a 2029. Valores entre 30 e 99 são interpretados como intervalo de anos entre 1930 a 1999. Para outros intervalos ou valores para o argumento ano(year) use um valor com 4 dígitos : 1850.
Nota: Se você exceder o valor para os intervalos válidos haverá um incremento para o próximo valor , assim , se você informar 35 para o argumento dias ele será avaliado como um mês mais alguns dias dependendo do ano. Se você informar um valor maior que o intervalo -32.768/32.767 vai ocorrer um erro.
Lembre-se que o tipo de dado Time/Date é armazenado como um número de precisão dupla (double-precision) e se você não tomar cuidado poderá obter resultados incorretos ao tentar manipular valores de data e hora em uma expressão.
Agora , usando a função DateSerial , que tal alguns cálculos com datas ? Vamos lá…
– Primeiro dia do mês atual DateSerial(Year(Date), Month(Date), 1)
DateSerial(Year(Date), Month(Date) + 1, 1) – Último dia do mês atual DateSerial(Year(Date), Month(Date) + 1, 0) – Último dia do próximo mês DateSerial(Year(Date), Month(Date) + 2, 0) – Primeiro dia do mês anterior DateSerial(Year(Date), Month(Date) – 1, 1) – Último dia do mês anterior DateSerial(Year(Date), Month(Date), 0)
– Primeiro dia semana atual (Domingo) Date – Weekday(Date) + 1
– Primeiro dia semana atual (Domingo) Date – Weekday(Date) + 7
– Quantos dias há no mês (11 refere-se a novembro) Datepart(“d”, DateSerial(2003,11 + 1, 0)) |
Private Sub Command1_Click(Index As Integer) Select Case Index |
Calculando intervalo de horas
Como as horas são armazenadas como uma fração de 24 , se você tentar somar , subtrair , multiplicar ou dividir intervalos de horas maiores que 24 você vai obter resultados incorretos. Exemplo :
Private Sub Command2_Click() Dim dataincial As Date
datainicial = #6/1/1993 8:00:00 AM# MsgBox Format(datafinal – datainicial, “hh:mm”)
End Sub |
– O código ao lento tenta calcular a diferença em horas entre os dias 01/6 a 03/06 e vai dar o resultado final como sendo de 05:00 quando na verdade o resultado correto seria 53:00. |
Para resolver este problema você deve usar as funções Int() e CSng() para separar o valor do tempo em diferentes variávies para dias , horas , minutos e segundos.
A seguir temos uma função que calcula o intervalo de tempo para valores maiores que 24 horas e expressa em dias , horas , minutos e segundos.
Function calculaIntervaloTempo(intervalo) Dim totalHoras As Long Dim dia As Long, horas As Long, minutos As Long, segundos As Long dias = Int(CSng(intervalo)) horas = totalHoras Mod 24 calculaIntervaloTempo = dias & ” dias ” & horas & ” Horas ” & minutos & ” Minutos ” & segundos & ” Segundos ” End Function |
Se você usar a função para obter o resultado do intervalo de tempo para o exemplo acima:
Dim dataincial As Date
datainicial = #6/1/1993 8:00:00 AM#
CalculaIntervaloTempo(datafinal-datainicial)
Vai obter o resultado: 2 dias 5 horas 0 minutos 0 segundos ou seja 53 horas.
|
Se você quiser o resultado em horas basta usar a seguinte função: CalculaIntervaloHoras(datafinal-datainicial)
Function CalculaIntervaloHoras(intervalo) Dim resultado As Double
|
Se você quiser o resultado em segundos basta usar a seguinte função: CalculaIntervaloSegundos(datafinal-datainicial)
Function CalculaIntervaloSegundos(intervalo) Dim resultado As Double
|
Precisando de outros cálculos ???
1 – Quantos dias faltam para uma determinada data ?
Private Sub calculaDias() data = InputBox(“Digite uma data : Use o formato: DD/MM/AAAA (15/11/2003) “) If data <> “” Then |
2 – Quantos dias úteis existem entre duas datas ? (Não leva em conta feriados , somente sábados e domingos)
Function CalculaDiasUteis(dataInicio As Variant, dataFinal As Variant) As Integer Dim intSemanas As Integer dataInicio = DateValue(dataInicio) intSemanas = DateDiff(“w”, dataInicio, dataFinal) intFimDias = 0 Do While varDataCont < dataFinal ‘desconta os sábados e domingos CalculaDiasUteis = intSemanas * 5 + intFimDias |
3- Calcular a idade em anos de uma pessoa ?
Public Function Idade(nascimento As Date, hoje As Date) As Integer |
4- Calcular a idade em anos e meses de uma pessoa ?
Private Function calcula_idade(nascimento As Date) As String
dias = DateDiff(“d”, CVDate(nascimento), Now) calcula_idade = anos & ” anos ” & meses & ” mes(es)
End Function |
4- Precisando calcular datas fora do intervalo suportado ???
Você sabe que a função DateSerial somente suporta cálculos entre datas para o intervalo de datas entre 01 de janeiro de 100 até 31 de dezembro de 9999. Abaixo uma função que faz cálculos fora deste intervalo:
Function astroDay(ano, mes, dia) y = ano + (mes – 2.85) / 12 astroDay = Int(Int(Int(367 * y) – 1.75 * Int(y) + dia) – 0.75 * Int(0.01 * y)) + 1721119 End Function |
Ex: msgbox (astroDay(120000, 11, 25) – astroDay(120000, 11, 23)) ==> irá exibir 2.
referências:
HOW-TO : Find Number of Days Between Dates outside of Normal range
ACC2000 : Functions for calculating and displaying date/time values
E por hoje é só até mais…
José Carlos Macoratti
http://www.macoratti.net/
Um comentário
Parabens!, que explicação objetiva, quem sabe, sabe rs.
Obrigado.