Sie sind auf Seite 1von 15

Trabalhando com datas no Visual Basic

O Visual Basic 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 bsica de tempo. (Leia tambm : 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 contm : 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 configurao local que voc utilizou no seu computador. No calendrio 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. Ento 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 nmero de dias contados desde 31/12/1899. Os dias anteriores a 31/12/1899 so representados como nmeros 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 cdigo nunca as utilize como uma cadeia de caracteres( uma string) . Utilize os dados do tipo data no formato #ms/dia/ano# e ela ser interpretada de forma correta em qualquer local. Assim vejamos um exemplo: Se um usurio informar a data 7/01/98 em uma caixa de entrada de dados: CDate ("7/01/98") Portugus Ingls ir retornar os seguintes resultados:

07/01/98 ( sete de janeiro de 1998) 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 : Portugus Ingls 01/07/98 ( primeiro de Julho de 1998) 7/1/97 (primeiro de julho de 1998)

Se um usurio usando o idioma Portugus(Brasil) informar a data como 8/2/96 , a aplicao ir interpret-la como sendo a data oito de fevereiro de 1996 , pois o formato de datas para o idioma Portugus dia/ms/ano. J um usurio nos Estados Unidos informando a mesma data ter como resultado : dois de agosto de 1996. O formato indicado tambm evitar muitas dores de cabea 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 aniversrio igual a 30 de maro de 1960 - 30/03/1960. Sabendo que o campo que armazena a data de aniversrio chamado de aniv vamos montar uma consulta SQL para retornar todos os clientes com aniversrio em 30/03/1960. a-) Usando a data no formato dd/mm/aa (dd/mmyy) : No vai funcionar ( O recordset estar vazio ) Dim db As Database Dim rs As Recordset Set db = OpenDatabase("base.mdb") ' tabela clients Set rs = db.OpenRecordset("Clientes,dbopenDynaset") ' O formato da data dd/mm/yy. rs.FindFirst "Aniv = #30/03/60#" ... db.Close rs.Close b-) Usando a data no formato mm/dd/aa (mm/dd/yy) : Ir funcionar em qualquer idioma. Dim db As Database Dim rs As Recordset Set db = OpenDatabase("base.mdb") ' tabela clientes Set rs = db.OpenRecordset("Clientes,dbopenDynaset") ' O formato da data mm/dd/yy. rs.FindFirst "Aniv = #03/30/60#" ... db.Close rs.Close Formatando datas

Quando for usar a funo Format no utilize formatos do tipo dd/mm/yy ou mm/dd/yy. Prefira utilizar o formato nomeado que ir determinar qual conveno deve usar em tempo de execuo. Os formatos nomeados so: 1. 2. 3. 4. General Date Long Date Short Date Long Time

Ao utilizar esses nomes a sada ser baseada no idioma do usurio. 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, NovaData4 a-) Vejamos o resultado para um usurio rodando este cdigo nos Estados Unidos: 22-Aug-97 8/22/97 Monday, August 22, 1997 8/22/97 5:22:20 PM b-) Este mesmo cdigo para um usurio 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 no !!! voc pode usar a data no formato dd/mm/aa , mas lembrese de alterar para o formato mm/dd/aa quando for usar consultas SQL , para fazer isto utilize a funo 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 funo format: Dim MTime, MData, MStr MTime = #17:04:23# MyDate = #January 27, 1993# ' Retorna a hora do sistema no formato Longo MStr = Format(Time, "Long Time") ' retorna 10:18:50

' Retorna a data atual no formato Longo MStr = Format(Date, "Long Date") dezembro de 2000 MStr = MStr = MStr = 1993" MStr =

' retorna segunda-feira, 22 de

Format(MTime, "h:m:s") ' Retorna "17:4:23". Format(MTime, "hh:mm:ss AMPM") ' Retorna "05:04:23 PM". Format(MData, "dddd, mmm d yyyy") ' Retorna "quarta-feira, jan 27 Format(MData, "yyyymmdd") ' Retorna "19930127"

' Se o formato no fornecido , o retorno uma string MStr = Format(23) ' Retorna "23". ' formato definido pelo usurio MStr = Format(5459.4, "##,##0.00") ' Retorna "5.459,40". MStr = Format(334.9, "###0.00") ' Retorna "334,90". MStr = Format(5, "0.00%") ' Retorna "500,00%". MStr = Format("OLA", "<") ' Retorna "ola". MStr = Format("Tudo bem", ">") ' Retorna "TUDO BEM". Usando as funes Time , Date , Now , Hour , Minute e Second Para exibir a data e a hora atual necessrio verificar e obter estas informaes do relgio do seu computador ; assim a funo Time obtm a hora do sistema e a funo Date obtm a data do sistema. Para obter a data e a hora temos a funo Now. Assim resumindo: Funo Time Date Now Descrio variavel = Time variavel = Date variavel = Now Retorno Retorna a hora atual do sistema. Tipo de dados Variant Retorna a data atual do sistema. Tipo de dados Variant 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 funes : Date , Time e Now O resultado do processamento Se voc quiser atribuir novos valores para a data e a hora do seu sistema utilize : Dim Mhora as date

Mhora = #4:35:17 PM# 'atribui uma hora a varivel Time = Mhora ' define a hora do sistema como a da sua varivel Dim mdate As Date mdate = Format(#12/2/1995#, " dd/mm/yyyy") define uma nova data Date = mdate altera a data do sistema A funo Minute retorna um nmero inteiro entre 0 e 59 representando os minutos de uma determinada hora. Assim temos: Dim MTempo, MMinuto MTempo = #12:35:17# ' define um tempo MMinuto = Minute(MTempo) ' Retorna o valor 35 A funo Hour retorna a hora de um determinado tempo. Assim temos: Dim MTempo, MHora MTempo = #12:35:17# ' define um tempo MHora = Hour(MTempo) ' Retorna o valor 12 A funo Second retorna um nmero inteiro entre 0 e 59 representando os segundos do minuto.Assim temos: Dim MTempo, MSegundo MTempo = #12:35:17# ' define um tempo MSegundo = Second(MTempo) ' Retorna o valor 17 Verificando datas Geralmente usamos uma caixa de texto para a entrada de dados , certo ? e como fazemos para saber se um valor informado pelo usurio um valor que pode ser convertido para uma data ? Para isto podemos usar a funo IsDate. A sintaxe a seguinte : IsDate(expresso) A funo 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 funo IsDate aceita valores de formato de datas invlidos. Por exemplo para 66/9/15 IsDate retorna True Calculando e Convertendo Datas As principais funes para converter/calcular intervalo de datas no Visual Basic so: DateDiff Calcula a quantidade de intervalo de tempo entre duas datas

Sintaxe: DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) interval Uma string que indica o intervalo de tempo usado para calcular a diferena entre date1e date2. Pode assumir os seguintes valores: d (dia) , m (mes) , q (quinzena) , h (hora), s (segundo) , n (minuto), yyyy (ano), ww (semana) , w (dia da semana) . Obrigatrio date1, date2 Duas datas para calcular a diferena.Obrigatrio firstdayofweek Indica o primeiro dia da semana. Se no for usada assumido o Domingo. Opcional firstweekofyear Indica a primeira semana do ano.Se no informada assumida a semana do dia primeiro de janeiro.Opcional. Abaixo temos um exemplo de utilizao do parmetro Interval no clculo entre duas datas e os possveis resultados obtidos: Parmetro Intervalo "yyyy" "q" "m" "y" "d" "w" "ww" "h" "n" "s" Year Quarter Month Day Weekday Week Hour Minute Second Expresso DateDiff("yyyy", "7/4/76", "7/4/86") DateDiff("q", "7/4/76", "7/4/86") DateDiff("m", "7/4/76", "7/4/86") DateDiff("d", "7/4/76", "7/4/86") DateDiff("w", "7/4/76", "7/4/86") DateDiff("ww", "7/4/76", "7/4/86") DateDiff("h", "7/4/76", "7/4/86") DateDiff("n", "7/4/76", "7/4/86") DateDiff("s", "7/4/76", "7/4/86") Resultado 10 40 120 3652 3652 521 521 87648 5258880 315532800

Day of year DateDiff("y", "7/4/76", "7/4/86")

Vejamos agora um pequeno projeto para calcular a diferena entre a data de nascimento e a data atual em dias, meses, anos e segundos. 1. Inice um novo projeto no VB e no formulrio padro desenhe os seguintes controles : Uma etiqueta ( Data de Nascimento) uma Caixa de Texto ( text1.text="") e um boto de comando ( Efetua Clculos). Veja abaixo:

2. Insira o cdigo abaixo no evento Validate da caixa de Texto: Aqui usamos o evento Validate da Caixa de Texto para juntamente com a funo IsDate verificar se a data valida. Se a data for invlida o foco

continua no controle (Cancel=True) Private Sub Text1_Validate(Cancel As Boolean) If Not IsDate(Text1.Text) Then MsgBox " Data Invalida !! ", vbCritical, " Erro na Data " Cancel = True Else Data = CVDate(Text1.Text) End If End Sub 3. Agora insira o cdigo abaixo no evento Click do boto de comando: Private Sub Command1_Click() Dim d1, d2, d3, d4, d5 As Single d1 d2 d3 d4 = = = = DateDiff("d", Data, Now) DateDiff("m", Data, Now) DateDiff("yyyy", Data, Now) DateDiff("s", Data, Now) " Sua idade e : " & vbCrLf Msg & " ============================== " & vbCrLf Msg & " Em dias : " & d1 & " dias " & vbCrLf Msg & " Em meses : " & d2 & " meses " & vbCrLf Msg & " Em anos : " & d3 & " anos " & vbCrLf Msg & " Em segundos : " & d4 & " segundos " & vbCrLf

Msg Msg Msg Msg Msg Msg

= = = = = =

MsgBox Msg, vbOKOnly, " calculando intervalos de datas " End Sub 4. Em General Declarations do Formulrio digite: Dim Data As Date 5. Execute o projeto , informe uma data vlida ( o sistema ir checar ) e o resultado ser:

DatePart

Retorna a parte especifica de uma data. Retorna um tipo de dado Variant.

Sintaxe : DatePart(interval, date[,firstdayofweek[, firstweekofyear]]) Argumento interval Descrio Uma string que representa o intervalo de tempo que voc deseja retornar. Os valores possveis so: d (dia) , m (mes) , q (quinzena) , h (hora), s (segundo) , n (minuto), yyyy (ano). Obrigatrio, ww (semana) , w (dia da semana) Representa a data que voc pretende avaliar. Obrigatrio Indica o primeiro dia da semana. Se no for usada assumido o Domingo.Opcional Indica a primeira semana do ano.Se no informada assumida a semana do dia primeiro de janeiro.Opcional.

date firstdayofweek firstweekofyear

Um exemplo de utilizao desta funo seria o clculo do dia da semana ou da hora atual. Vejamos um exemplo de utilizao da funo DatePart : Dim data As Date ' Declara variaveis Dim Msg data = InputBox("Informe a data a avaliar ( dd/mm/yyyy ):") Msg Msg Msg Msg Msg Msg = = = = = = "Ano " & DatePart("yyyy", data) & vbCrLf Msg & "Trimestre " & DatePart("q", data) & vbCrLf Msg & "Mes " & DatePart("m", data) & vbCrLf Msg & "Semana " & DatePart("ww", data) & vbCrLf Msg & "Dia " & DatePart("d", data) & vbCrLf Msg & "Dia da semana " & DatePart("w", data)

MsgBox Msg Ao executar o exemplo acima e informar a data de avaliao como sendo a data : 11/12/2000 obteremos o seguinte resultado:

Retorna uma data para um ano , ms e dia especificados DateSerial Sintaxe : DateSerial(year, month, day) Argumentos Descrio

year

Valor do tipo Integer. Representa um nmero entre 100 e 9999. Obrigatrio.Valores entre 0 e 29 so interpretados como sendo os anos 2000-2029 , valores entre 30 e 99 so interpretados como os anos 1930-1999. Para representar anos fora destas faixas utilize o formato yyyy. Valor do tipo Integer. Representa uma expresso numrica Valor do tipo Integer. Representa uma expresso numrica

month day

Dim Data ' Tipo Variant ' Vamos atribuir a data 11 de dezembro de 2000 Data = DateSerial(00, 1 2, 11) MsgBox " A data : " &Data Ao executar o projeto com o cdigo acima iremos obter => 11/12/00

DateValue

Retorna uma data - tipo Variant.

Sintaxe : DateValue(date) - date uma expresso caractere que representa uma data entre 01/01/100 e 31/12/9999. Ou qualquer expresso que representa uma data/hora vlidas. Se a expresso utilizar incluir a informao de horas , a mesma no ser exibida. Se a parte referente ao ano da data for omitida DateValue utiliza o ano atual do seu sistema. Vejamos um exemplo de utilizao de DateValue. Dim Data Data = DateValue("11/12/00") Ao executar o projeto com o cdigo 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 relgio que dispara um evento programvel a um certo intervalo de tempo. O evento principal deste controle o evento Timer. Obs: O controle Timer invisvel em tempo de execuo. Podemos definir o intervalo no qual o evento Timer entra em ao 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 mximo para a propriedade Interval 65.535 , que indica que o mximo intervalo que podemos usar 65,5 segundos. As principais propriedades do controle Timer so: Propriedade Descrio Name Property Enabled Interval Left Top O nome padro Timer1 para o primeiro controle. Descreve a propriedade Habilita ou desabilita o controle. O padro True. Determina,em milisegundos, quando o evento Timer ir disparar (1 segundo = 1000). A posio da margem direita do controle Timer. A posio do topo da margem do controle Timer.

Para relaxar vamos criar um projeto usando o controle Timer que cria um relgio no VB. Vamos l... Inicie um novo projeto no Visual Basic Insira um controle Label(lbl_time) e um controle Timer(timer1) no formulrio padro (frmrelogio).

Defina as seguintes propriedades: A propriedade BorderStyle do formulrio dever ser igual a 1 - Fixed Single e altere a propriedade MinButton para True. A propriedade Interval do controle Timer deve ser igual a 500 (meio segundo) Aumente o tamanho da fonte do controle Lbl_time e defina a propriedade Autosize deste controle como True e a cor do fundo do controle para branco. Agora insira o cdigo abaixo no evento Load do formulrio:

Private Sub Form_Load() lbl_time.Top = ScaleTop lbl_time.Left = ScaleLeft lbl_time.Width = ScaleWidth lbl_time.Height = ScaleHeight End Sub

Finalmente insira o cdigo abaixo no evento Timer do controle Timer1.

Private Sub Timer1_Timer() If frmrelogio.WindowState = vbNormal Then lbl_time.Caption = CStr(Time) frmrelogio.Caption = Format(Date, "Long Date") Else 'Se o formulrio 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 relgio em tempo real. (Que tal criar uma OCXs para este projeto de forma a poder us-la nos formulrios Web ?) Funes teis para Clculos 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 funo recebe um inteiro e verifica se o ano bissexto. Chamada : Bissexto(2000) ' Retorna True

2- ltimo dia de um ms Public Function FimdoMes(strData As String, blnSaltaMesAtual As Boolean) As String Dim Dim Dim Dim strAno As String strMes As String strDia As String strProximoDia As String

strData = Format(strData, "yyyymmdd") strAno = Mid$(strData, 1, 4) strMes = Mid$(strData, 5, 2) ' Pega a data e o mes atual ' Select Case strMes Case "04", "06", "09", "11" strDia = "30" Case "02" If Bissexto(Val(strAno)) Then strDia = "29" Else strDia = "28" End If Case Else strDia = "31" End Select FimdoMes = strAno & strMes & strDia If (FimdoMes = strData) And SaltaMesAtual Then strProximoDia = ProximoDia(strData) FimdoMes = FimdoMes(strProximoDia, False) End If End Function Public Function ProximoDia(strDatea As String) As String Dim dteData As Date ' ' Converte a data para o formato "yyyymmdd" ' dteData = Format(strData, "@@@@-@@-@@") ProximoDia = Format$(DateAdd("d", 1, dteData), "yyyymmdd")

End Function Esta funo calcula o ltimo dia de um ms para uma determinada data. Deve receber como parmetros a data que voc deseja calcular e um valor boleano (Verdadeiro/Falso) que ir fazer a a funo considerar o ms seguinte quando a data que voc informou se referir ao ltimo dia de um ms. Assim se voc chamar a funo assim: retorno ser 31/12/2000. Se voc chamar a funo assim: ser 31/01/2001. FimdoMes("22/12/200") o

FimdoMes("31/12/200")

o retorno

Observe que a funo utiliza a funo Bissexto e uma outra funo ProximoDia - que nada mais faz do que receber uma data e acrescentar um dia mesma . (Utiliza a funo DateAdd ) 2- Diferena entre horas Se precisar calcular a diferena entre dois horrios em valores inteiros , a funo abaixo faz o servio. O projeto contm dois controles maskeditbox e um boto de comando Function CalculaHora(HrIni, HrFim) As Double Dim dblDifHoras As Double If IsNull(HrIni + HrFim) Then Exit Function dblDifHoras = DateDiff("n", HrIni, HrFim) CalculaHora = dblDifHoras / 60 End Function Private Sub Command1_Click() Dim x As Double If CDate(maskini) > CDate(maskfim) Then MsgBox "A hora final nao pode ser inferior a hora inicial !!" Exit Sub End If x = CalculaHora(maskini.Text, maskfim.Text) MsgBox " a diferenca : " & x End Sub

Clculos com Datas e horas Para terminar vamos mostrar como fazer alguns clculos com datas e horas: 1-) Calculo da quantidade de horas em um determinado perodo: 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... :-)

Das könnte Ihnen auch gefallen