 Visual Basic 6 - Trabalhando com datas
  
Visual Basic 6 - Trabalhando com datas
|  | Hoje veremos como trabalhar com datas na linguagem Visual Basic 6. |  | 
O Visual Basic 6 trata o tempo de uma maneira diferente a que estamos acostumados. Para manipular o tempo o VB utiliza o tipo de dados Date que usa o dia como unidade básica de tempo. (Leia também : Visual Basic - Datas e o ano 2000)
Assim uma hora é 1/24 avos de um dia ,um minuto a 1/1440 e um segundo é 1/86400 avos de um dia . ( legal né ...:-( ). Assim uma semana pode ser representada pelo numero de dias que a contém : 7 dias.
Da mesma forma 0,5 horas seria 30/12/1899 12:00:00 , onde 0 corresponde a data e parte decimal 5 corresponde às horas.
O tipo de dados Date irá exibir datas conforme a configuração local que você utilizou no seu computador.
No calendário Juliano o primeiro dia é definido como sendo : 1 de Janeiro de 0000. Já o nosso querido VB considera o primeiro dia como sendo : 31 de dezembro de 1899. Então ele usa como base esta data para calcular todas as demais datas.
Por exemplo: o dia 04 de dezembro de 2000 é o dia 36863 , que o número de dias contados desde 31/12/1899. Os dias anteriores a 31/12/1899 são representados como números negativos . Assim o dia 21/04/1500 esta a -145986 dias da data 31/12/1899.
Usando o formato apropriado
Quando você for usar datas em seu código nunca as utilize como uma cadeia de caracteres( uma string) . Utilize os dados do tipo data no formato #mês/dia/ano# e ela será interpretada de forma correta em qualquer local. Assim vejamos um exemplo:
Se um usuário informar a data 7/01/98 em uma caixa de entrada de dados:
CDate ("7/01/98") irá retornar os seguintes resultados:
| Português | 07/01/98 ( sete de janeiro de 1998) | 
| Inglês | 7/1/98 (primeiro de julho de 1998) | 
Se você informar a mesma data usando o formato indicado (#mes/dia/ano#):
CDate(#7/1/98#) retornará :
| Português | 01/07/98 ( primeiro de Julho de 1998) | 
| Inglês | 7/1/97 (primeiro de julho de 1998) | 
Se um usuário usando o idioma Português(Brasil) informar a data como 8/2/96 , a aplicação irá interpretá-la como sendo a data oito de fevereiro de 1996 , pois o formato de datas para o idioma Português é dia/mês/ano. Já um usuário nos Estados Unidos informando a mesma data terá como resultado : dois de agosto de 1996.
O formato indicado também evitará muitas dores de cabeça quanto você estiver armazenando datas em um banco de dados e utilizar consultas SQL para realizar buscas ou filtrar um recordset do seu banco de dados Vejamos um exemplo :
1-) Suponha que você tenha um banco de dados chamado base.mdb e que deseja procurar na tablela clientes por todos os clientes com data de aniversário igual a 30 de março de 1960 - 30/03/1960. Sabendo que o campo que armazena a data de aniversário é chamado de aniv vamos montar uma consulta SQL para retornar todos os clientes com aniversário em 30/03/1960.
a-) Usando a data no formato dd/mm/aa (dd/mmyy) : Não vai funcionar ( O recordset estará vazio )
|  | 
b-) Usando a data no formato mm/dd/aa (mm/dd/yy) : Irá funcionar em qualquer idioma.
|  | 
Formatando datas
Quando for usar a função Format não utilize formatos do tipo dd/mm/yy ou mm/dd/yy. Prefira utilizar o formato nomeado que irá determinar qual convenção deve usar em tempo de execução. Os formatos nomeados são:
Ao utilizar esses nomes a saída será baseada no idioma do usuário. Vejamos um exemplo:
MDate = #8/22/1997 5:22:20 PM#
NovaData1 = Format(MDate, "Medium Date")
NovaData2 = Format(MDate, "Short Date")
NovaData3 = Format(MDate, "Long Date")
NovaData4 = Format(MDate, "General Date")
Debug.Print NovaData1, NovaData2, NovaData3, NovaData4a-) Vejamos o resultado para um usuário rodando este código nos Estados Unidos:22-Aug-97 	8/22/97      Monday, August 22, 1997   		8/22/97 5:22:20 PMb-) Este mesmo código para um usuário do Brasil terá o seguinte resultado:22/ago/97 22/08/97 sexta-feira, 22 de agosto de 1997 22/08/97 17:22:20
Bem , a esta altura do campeonato você deve estar se perguntando: " Quer dizer que agora eu vou ter que usar a data no formato mm/dd/aa nos meus aplicativos ???"  Claro que não !!! você  pode usar a data no formato dd/mm/aa , mas lembre-se de alterar para o formatomm/dd/aa quando for usar consultas SQL , para fazer isto utilize a função format. Obs: O crystal Reports usa o formato aaaa/mm/dd. Portanto se você for usar o SelectionFormula no Crystal Reports e isto envolver datas , você vai ter que alterar para o formato yyyy/mm/dd.Outros exemplos usando a função format:|  | 
Usando as funções Time , Date , Now , Hour , Minute e Second
Para exibir a data e a hora atual é necessário verificar e obter estas informações do relógio do seu computador ; assim a função Time obtém a hora do sistema e a função Date obtém a data do sistema. Para obter a data e a hora temos a função Now. Assim resumindo:
| Função | Descrição | Retorno | 
| Time | variavel = Time | Retorna a hora atual do sistema. Tipo de dados Variant | 
| Date | variavel = Date | Retorna a data atual do sistema. Tipo de dados Variant | 
| Now | variavel = Now | Retorna a data e hora atual do sistema. Tipo de dados variant | 
Assim para obter os valores para a hora, data e data e hora podemos fazer assim:
| Dim var1, var2, var3 as date var1 = Date var2 =Time var3= Now MsgBox var1 & " - " & var2 & " - " & var3 | 
 | 
| As funções : Date , Time e Now | O resultado do processamento | 
Se você quiser atribuir novos valores para a data e a hora do seu sistema utilize :
|  | 
|  | 
A função Minute retorna um número inteiro entre 0 e 59 representando os minutos de uma determinada hora.
Assim temos:
|  | 
A função Hour retorna a hora de um determinado tempo. Assim temos:
|  | 
A função Second retorna um número inteiro entre 0 e 59 representando os segundos do minuto.Assim temos:
|  | 
Verificando datas
Geralmente usamos uma caixa de texto para a entrada de dados , certo ?  e como fazemos para saber se um
valor informado pelo usuário é um valor que pode ser convertido para uma  data ?  Para isto podemos usar a função IsDate.A  sintaxe é a seguinte : IsDate(expressão)A função retorna True se a data pode ser convertida para uma Data.  Assim:Dim Data, Data1,  Data2 ,  MData
Data = "February 12, 1969": Data1 = #2/12/69#: Data2 = "Hello"
MData = IsDate(Data)   ' Retorna True.
MData = IsDate(Data1)   ' Retorna True.
MData = IsDate(Data2)   ' Retorna False.
OBS : Mas cuidado a função IsDate aceita valores de formato de datas inválidos. Por exemplo para 66/9/15 IsDate retorna TrueCalculando e Convertendo Datas
As principais funções para converter/calcular intervalo de datas no Visual Basic são:
| DateDiff | Calcula a quantidade de intervalo de tempo entre duas datas | ||||||||||||||||||||||||||||||||||||||||||||
| Sintaxe: DateDiff(interval,
      date1, date2[, firstdayofweek[,
      firstweekofyear]]) 
 | |||||||||||||||||||||||||||||||||||||||||||||
| Abaixo temos um exemplo de utilização do parâmetro Interval no cálculo entre duas datas e os possíveis resultados obtidos:
 | |||||||||||||||||||||||||||||||||||||||||||||
| Vejamos agora um pequeno
      projeto para calcular  a diferença entre a data de nascimento e a
      data atual em dias, meses, anos e segundos. 
 
 
 
 
 
 
 
 | |||||||||||||||||||||||||||||||||||||||||||||
| DatePart | Retorna a parte especifica de uma data. Retorna um tipo de dado Variant. | ||||||||||||
| Sintaxe : DatePart(interval, date[,firstdayofweek[, firstweekofyear]]) 
 
 Ao executar o exemplo acima e informar a data de avaliação como sendo a data : 11/12/2000 obteremos o seguinte resultado: 
 | |||||||||||||
| DateSerial | Retorna uma data para um ano , mês e dia especificados | |||||||||
| Sintaxe
      :    DateSerial(year, month, day) 
 
 | ||||||||||
| Ao executar o projeto com o código acima iremos obter => 11/12/00 | ||||||||||
| DateValue | Retorna uma data - tipo Variant. | |
| Sintaxe : DateValue(date)   
      - date é uma expressão caractere que
      representa uma data entre 01/01/100 e 31/12/9999. Ou qualquer expressão
      que representa uma data/hora válidas. Se a expressão utilizar incluir a informação de horas , a mesma não será exibida. Se a parte referente ao ano da data for omitida DateValue utiliza o ano atual do seu sistema. Vejamos um exemplo de utilização de DateValue. 
 Ao executar o projeto com o código acima iremos transforma a string " 11/12/00" na data => 11/12/00 | ||
Usando o Controle Timer
O Visual Basic possui o controle Timer que lhe permite tratar eventos relacionados com o tempo. Este controle
funciona como um relógio que dispara um evento programável a um certo
intervalo de tempo. O  evento principal deste controle é o evento Timer.
que lhe permite tratar eventos relacionados com o tempo. Este controle
funciona como um relógio que dispara um evento programável a um certo
intervalo de tempo. O  evento principal deste controle é o evento Timer.
Obs: O controle Timer é invisível em tempo de execução.
Podemos definir o intervalo no qual o evento Timer entra em ação atribuindo um valor a propriedade Interval do controle. A unidade de medida usada é o milisegundo ; assim se você quiser disparar o evento a cada segundo deve usar o seguinte valor para a propriedade Interval.
Timer1.Interval = 500 O valor máximo para a propriedade Interval é 65.535 , que indica que o máximo intervalo que
podemos usar é 65,5 segundos.
| Propriedade | Descrição | 
| Name | O nome padrão é Timer1 para o primeiro controle. | 
| Property | Descreve a propriedade | 
| Enabled | Habilita ou desabilita o controle. O padrão é True. | 
| Interval | Determina,em milisegundos, quando o evento Timer irá disparar (1 segundo = 1000). | 
| Left | A posição da margem direita do controle Timer. | 
| Top | A posição do topo da margem do controle Timer. | 
Para relaxar vamos criar um projeto usando o controle Timer que cria um relógio no VB. Vamos lá...
Inicie um novo projeto no Visual Basic
Insira um controle Label(lbl_time) e um controle Timer(timer1) no formulário padrão (frmrelogio).
| 
 | 
| Private Sub Form_Load() lbl_time.Top = ScaleTop lbl_time.Left = ScaleLeft lbl_time.Width = ScaleWidth lbl_time.Height = ScaleHeight End Sub | 
| Private Sub Timer1_Timer() If frmrelogio.WindowState = vbNormal Then lbl_time.Caption = CStr(Time) frmrelogio.Caption = Format(Date, "Long Date") Else 'Se o formulário for minimizado 'a propriedade caption do formulario recebe a hora 'e fique visivel na barra de tarefas frmrelogio.Caption = CStr(Time) End If End Sub | 
Execute o projeto e você deverá obter:
| 
 | 
Um relógio em tempo real.  (Que tal criar uma OCX´s para este projeto de forma a poder usá-la nos
formulários Web ?)
(Que tal criar uma OCX´s para este projeto de forma a poder usá-la nos
formulários Web ?)
Funções úteis para Cálculos com Datas
1- Ano Bissexto
| Public Function
      Bissexto(intAno As Integer) As Boolean ' ' verifica se um ano é bissexto ' Bissexto = False If intAno Mod 4 = 0 Then If intAno Mod 100 = 0 Then If intAno Mod 400 = 0 Then Bissexto = True End If Else Bissexto = True End If End If End Function | 
A função recebe um inteiro e verifica se o ano é bissexto. Chamada : Bissexto(2000) ' Retorna True
2- Último dia de um mês
| Public Function
      FimdoMes(strData As String, blnSaltaMesAtual As Boolean) As String Dim strAno As String Dim strMes As String Dim strDia As String Dim strProximoDia As String strData = Format(strData, "yyyymmdd")  FimdoMes =
      strAno & strMes & strDia Public Function
      ProximoDia(strDatea As String) As String | 
Esta função calcula o último dia de um mês para uma determinada data. Deve receber como parâmetros a data que você deseja calcular e um valor boleano (Verdadeiro/Falso) que irá fazer a a função considerar o mês seguinte quando a data que você informou se referir ao último dia de um mês.
Assim se você chamar a função assim: FimdoMes("22/12/200") o retorno será 31/12/2000.
Se você chamar a função assim: FimdoMes("31/12/200") o retorno será 31/01/2001.
Observe que a função utiliza a função Bissexto e uma outra função - ProximoDia - que nada mais faz do que receber uma data e acrescentar um dia á mesma . (Utiliza a função DateAdd )
2- Diferença entre horas
Se precisar calcular a diferença entre dois horários em valores inteiros , a função abaixo faz o serviço. O projeto contém dois controles maskeditbox e um botão de comando
| Function CalculaHora(HrIni, HrFim) As Double Dim dblDifHoras As Double    If IsNull(HrIni + HrFim) Then Exit Function Private Sub Command1_Click() | 

Cálculos com Datas e horas
Para terminar vamos mostrar como fazer alguns cálculos com datas e horas:
1-) Calculo da quantidade de horas em um determinado período:
a-) Hora inicial : 9:00 horas Hora Final : 17:00 horas
| horas_trabalhadas= format((#17:00# - #09:00#) * 24, "#0.0") ? horas_trabalhadas & " horas " Resultado => 8,0 horas | 
b-) Hora inicial : 19:00 horas Hora Final : 7:30 horas do outro dia
| horas_trabalhadas= format((1+ #7:30# - #19:00#) * 24, "#0.0") ? horas_trabalhadas & " horas " Resultado => 12,5 horas | 
c-) Hora inicial : 15:00 horas Hora Final : 20:30 horas do outro dia (mais de 24 horas)
| horas_trabalhadas= format((#15:00# + #20:30#) * 24, "#0.0") ? horas_trabalhadas & " horas " Resultado => 35,5 horas | 
d-) Hora inicial : 7:00 horas Hora Final : 21:00 horas do outro dia (mais de 24 horas)
| horas_trabalhadas= format((#07:00# + #21:00#), "#0.0") ? horas_trabalhadas & " dias " Resultado => 1,2 dias | 
Acabei... :-)
| 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: