 Visual Basic 6 : Datas , Datas e mais
datas...
  Visual Basic 6 : Datas , Datas e mais
datas...
|  | Hoje veremos como calcular a idade de uma pessoa. |  | 
Bem, eu já tratei deste assunto nos artigos :
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 :
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) Dim data As Date Select Case Index Case 0 data = DateSerial(Year(Date), Month(Date), 1) Case 1 data = DateSerial(Year(Date), Month(Date) + 1, 1) Case 2 data = DateSerial(Year(Date), Month(Date) + 1, 0) Case 3 data = DateSerial(Year(Date), Month(Date) + 2, 0) Case 4 data = DateSerial(Year(Date), Month(Date) - 1, 1) Case 5 data = DateSerial(Year(Date), Month(Date), 0) Case 6 data = Date - Weekday(Date) + 1 Case 7 data = Date - Weekday(Date) + 7 End Select MsgBox Command1(Index).Caption & " => " & data, vbInformation, "Data hora atual = > " & Now() End Sub | 
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 totalMinutos As Long Dim totalSegundos As Long Dim dia As Long, horas As Long, minutos As Long, segundos As Long dias = Int(CSng(intervalo)) totalHoras = Int(CSng(intervalo * 24)) totalMinutos = Int(CSng(intervalo * 1440)) totalSegundos = Int(CSng(intervalo * 86400)) 
    horas = totalHoras Mod 24 | 
    Dim dataincial As Date
    Dim datafinal As Date
    datainicial = #6/1/1993 
    8:00:00 AM#
    datafinal = #6/3/1993 1:00:00 PM#
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() Dim data As String data = InputBox("Digite uma data : Use o formato: DD/MM/AAAA (15/11/2003) ") If data <> "" Then If IsDate(data) Then MsgBox "Faltam " & DateDiff("d", Now, data) & " dias " & " até " & data, vbInformation, "Data atual => " & Format(Now(), "dd/mm/yyyy") Else MsgBox " Data Inválida ", vbCritical End If End If End Sub | 
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   'desconta os 
    sábados e domingos | 
3- Calcular a idade em anos de uma pessoa ?
| Public 
    Function Idade(nascimento As Date, hoje As Date) As Integer If Month(hoje) < Month(nascimento) Or (Month(hoje) = Month(nascimento) And Day(hoje) < Day(nascimento)) Then Idade = Year(hoje) - Year(nascimento) - 1 Else Idade = Year(hoje) - Year(nascimento) End If End Function | 
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) Dim y As Double 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... 
| 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 Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter 
Referências: