CALCULAR IDADE ANO BISSSEXTO

JONASJTG 24/04/2017 17:18:12
#473515
Bom dia a todos!

o codigo abaixo está funcionado normal mas quando tem ano bissexto ele não calcula corretamente se alguem puder ajudar eu agradeço.

Como eu faço para calcular idade quando e ano bissexto?

Dim anos, meses, dias, dias_sobran As Integer

Dim anos_str, meses_str, dias_str As String

Dim PriFec As Date = Me.txtDatadeNasc.Text

Dim SecFec As Date = CDate(Date.Today)

Dim DiasTotales As Long = DateDiff(DateInterval.Day, PriFec, SecFec)

Try

anos = DiasTotales \ 365

dias_sobran = DiasTotales Mod 365

meses = dias_sobran \ 30

dias = dias_sobran Mod 30

If (anos > 0) Then

anos_str = anos & [Ô] ano(s) [Ô]

Else

anos_str = [Ô][Ô]

End If

If (meses > 0) Then

meses_str = meses & [Ô] mes(es) [Ô]

Else

meses_str = [Ô][Ô]

End If

If (dias > 0) Then

dias_str = dias & [Ô] dia(s)[Ô]

Else

dias_str = [Ô][Ô]

End If
txtIdadeAtualDasVacas.Text = Trim(anos_str & meses_str & dias_str)

Catch ex As Exception
MsgBox([Ô]A DATA DE NASCIMENTO [Ô] & txtDatadeNasc.Text & [Ô] NÃO FOI ENCONTRADO![Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
End Try
KERPLUNK 24/04/2017 17:47:30
#473520
Use o objeto TimeSpan para calcular períodos de tempo. Ele já contempla o calendário padrão, incluindo dias de anos bisextos.
JONASJTG 24/04/2017 17:50:04
#473522
Kerplunk
Poderia posta um exemplo fazendo favor?
KERPLUNK 24/04/2017 19:29:44
#473527
Sem problemas
JONASJTG 24/04/2017 21:04:08
#473536
Kerplunk não desculpe mas não entende nada
KERPLUNK 24/04/2017 22:19:57
#473538
Você viu o link? Tem um exemplo do código...
JCM0867 25/04/2017 19:55:45
#473560
Essa rotina que fiz calcula idade+meses e antes de um ano meses+dias
Fiz ela qdo comecei no VB.Net provavelmente possa ser melhorada
Funciona 100%
Se preferir tira o que está em vermelho que uma classe para validar data

[ô]mskAluDataNascimento.Text = Data a calcular
[ô]txtIdade.Text = Resultado

Exempo: 29/02/2008 = 09a-01m

Private Sub CalculaIdade()
Dim txtIdade1, txtIdade2 As Integer
Dim AluDataNascimento1 As Date

ValidaData.CampoData = [Ô]AluDtNascimento[Ô]
ValidaData.VerificaData()
[txt-color=#e80000] If ValidaData.ResultadoData Then[/txt-color]

AluDataNascimento1 = CDate(mskAluDataNascimento.Text)

txtIdade.Text = ((DateAndTime.Year(Now.Date) - DateAndTime.Year(AluDataNascimento1)) - 1) + IIf((DateAndTime.Month(Now.Date)) * 100 + DateAndTime.Day(Now.Date) >= (DateAndTime.Month(AluDataNascimento1)) * 100 + DateAndTime.Day(AluDataNascimento1), 1, 0)
If txtIdade.Text = 0 Then
txtIdade1 = IIf(DateAndTime.Year(Now.Date) > DateAndTime.Year(AluDataNascimento1), 12 - DateAndTime.Month(AluDataNascimento1) + DateAndTime.Month(Now.Date), DateAndTime.Month(Now.Date) - DateAndTime.Month(AluDataNascimento1)) -
IIf(DateAndTime.Day(Now.Date) < DateAndTime.Day(AluDataNascimento1), 1, 0)
txtIdade2 = DateDiff([Ô]d[Ô], DateAdd(DateInterval.Month, txtIdade1, AluDataNascimento1.AddDays((IIf(DateAndTime.Day(Now.Date) < DateAndTime.Day(AluDataNascimento1), 1, 0)) * -1)), Now.Date)
txtIdade.Text = IIf(txtIdade1 < 10, [Ô]0[Ô] + Trim(Str(txtIdade1)), Trim(Str(txtIdade1))) + [Ô]m-[Ô] +
IIf(txtIdade2 < 10, [Ô]0[Ô] + Trim(Str(txtIdade2)), Trim(Str(txtIdade2))) + [Ô]d[Ô]
Else
txtIdade1 = txtIdade.Text
txtIdade2 = DateDiff([Ô]m[Ô], DateAdd(DateInterval.Year, txtIdade1, AluDataNascimento1), Now.Date) - IIf(DateAndTime.Day(Now.Date) < DateAndTime.Day(AluDataNascimento1), 1, 0)
txtIdade.Text = IIf(txtIdade1 < 10, [Ô]0[Ô] + Trim(Str(txtIdade1)), Trim(Str(txtIdade1))) + [Ô]a-[Ô] +
IIf(txtIdade2 < 10, [Ô]0[Ô] + Trim(Str(txtIdade2)), Trim(Str(txtIdade2))) + [Ô]m[Ô]
End If
txtIdade.Text = Replace(Replace(Replace(txtIdade.Text, [Ô]-00d[Ô], [Ô][Ô]), [Ô]00m-[Ô], [Ô][Ô]), [Ô]-00m[Ô], [Ô][Ô])
[txt-color=#e80000]End If[/txt-color]
End Sub




[txt-color=#0000f0]Precisando de um Sistema de Gestão Educacional?[/txt-color]
Desenvolvido em VB.NET + SQL Server + Crystal Reports
Conheça nossa Solução: www.cjsystem.com.br
NICKOSOFT 27/04/2017 01:30:48
#473605
Resposta escolhida
um simples datediff não ajuda?
JONASJTG 27/04/2017 12:46:58
#473617
Bom dia a todos!

Queria agradecer a todos que me ajudaram!

cheguei nesta solução!

Public Sub novaidade()
Dim anos_str, mes_str, dia_str As String
Dim datacompleta As DateTime

Try
datacompleta = New DateTime(frmCadastro.txtDatadeNasc.Value.Year, frmCadastro.txtDatadeNasc.Value.Month, frmCadastro.txtDatadeNasc.Value.Day)
Dim tday As TimeSpan = DateTime.Now.Subtract(datacompleta)
Dim anos As Integer, mes As Integer, dia As Integer
mes = 12 * (DateTime.Now.Year - dob.Year) + (DateTime.Now.Month - datacompleta.Month)

If DateTime.Now.Day < datacompleta.Day Then
mes -= 1
dia = DateTime.DaysInMonth(datacompleta.Year, datacompleta.Month) - datacompleta.Day + DateTime.Now.Day
Else
dia = DateTime.Now.Day - datacompleta.Day
End If

anos = Math.Floor(mes / 12)
mes -= anos * 12

If (anos > 0) Then
anos_str = anos & [Ô] anos [Ô]
Else
anos_str = [Ô][Ô]
End If

If (mes > 0) Then
mes_str = mes & [Ô] meses [Ô]
Else
mes_str = [Ô][Ô]
End If

If (dia > 0) Then
dia_str = dia & [Ô] dias[Ô]
Else
dia_str = [Ô][Ô]

End If
frmCadastro.txtIdadeAtualDasVacas.Text = Trim(anos_str & mes_str & dia_str)
Catch ex As Exception
MsgBox([Ô]A DATA DE NASCIMENTO [Ô] & frmcadastro.txtDatadeNasc.Value & [Ô] NÃO FOI ENCONTRADO![Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
End Try
End Sub
Tópico encerrado , respostas não são mais permitidas