23/02/2010

Calculo de idade

É comum nos depararmos com situações em que um programa precisa calcular a idade de alguém ou alguma coisa. Você sabe como isso pode ser feito? Se não sabe, agora vai saber.

A classe Date do RealBasic pode nus devolver o valor de sua data em segundos, o que facilita muito a encontrar uma idade precisa.

Veja esta tabela:

1 Minuto = 1m 60s
1 Hora = 1h 60m 3600s
1 Dia = 1d 24h 1440m 86400s
1 ano = 365.25d 8766h 525960m 31557600s

"Nos deparamos aqui com o POG original como é relatado na Deciclopedia :p"

Note que o ano tem 365.25 dias, em outra conotação, 365 dias e 6horas. Como 6h é um quarto de 24h (1 dia), então ¼ = 0.25. Isto resolve os problemas de cálculos com anos bissextos.

Inutilmente, a saber:
O segundo é a duração de 9.192.631.770 períodos da radiação correspondente à transição entre dois níveis hiperfinos do estado fundamental do átomo de césio 133.

Logo a diferença entre a data atual e a data anterior corresponde a idade em segundos. Que por sua vez dividida pelo Ano em segundos teremos a idade, que é normalmente seguida de um fracionário.

Se este fracionário for isolado e multiplicado por 12 teremos os meses após ultimo aniversário. E assim com os dias (por 24), com as horas (por 60) ..

Dim N As String
Dim Data As Date
Dim Hoje As Date
Dim idade As Double
Dim r as integer

N = "18/09/1975"

Hoje = new Date

//converte texto em data e encerra se o texto não for uma data
if Not ParseDate(n,Data) then Return

//pega a diferensa em segundos entre as duas datas
idade = Hoje.TotalSeconds - Data.TotalSeconds

idade = idade / 31557600 //Calcula a idade em anos
r = Floor(idade) //ignora valores apos o ponto decimal
N = r.Str + " anos "

idade = (idade - r) * 12 //Meses
r = Floor(idade)
N = N + r.Str + " meses "

idade = (idade-r) * 24 //Dias
r = Ceil(idade)
N = N + r.Str + " dias "

MsgBox n

Para os que só copião e colam e depois dizem “não funciona”, vale lembrar que a propriedade Str não é padrão na biblioteca do RB. E é exatamente igual a um CStr() mas como função estendida do tipo inteiro (só pode ser inserida dentro de um modulo global)

Function Str(Extends int As Integer) As String

Return CStr(int)

End Function

Ou substitua r.str por cstr( r )

Até a próxima.