Alter berechnen

SMoeller

Mitglied
Moin,
ich will ein Programm schreiben, mit dem ich das Alter eines Menschen berechnen kann. Dazu verwende ich die Methode System.currentTimeMillis(). Da diese Methode die Millisekunden seit dem 1.1.1970 zählt, ziehe ich die 1970 von dem Geburtsjahr ab. Dann habe ich die Zeit, von dem Geburtsjahr bis zu 1970. Da diese Zeit ja später von dem Alter abgezogen werden muss, will ich die Jahre in Millisekunden umrechnen. 1 Jarh hat 31536000000 Millisekunden(kann sein, das ich mich verrechnet habe). Allerdings ist diese Zahl anscheinend zu groß, obwohl ich als Datentyp long deklariert habe. Das kann aber eigentlich net sein, weil auch System.currentTimeMillis() in einer long Variable gespeichert ist. Auf jeden Fall zeigt mir eclipse folgende Meldung an:
The literal 31536000000 of type int is out of range
Was mir sehr komisch vorkommt, da ich ganz sicher long habe.
Ach und noch zur Info damit keiner nachgucken muss, long hat einen Wert von 10^18, muss also doch eigentlich schicken.
 
Ich habe das Thema über Google gefunden. Für den Fall, dass andere Leute auch bei Google nach der Berechnung des Alters suchen und diesen Eintrag finden:

Der Code hat einen Bug: Er berechnet das Alter falsch, wenn das Geburtstagsjahr von der Person, die heute Geburtstag hat, ein Schaltjahr war und das aktuelle Jahr kein Schaltjahr ist. Dann ist die Person ein Jahr älter, als der Algorithmus ausspuckt.

Betrifft die Zeile: if (d < cal.get(cal.DAY_OF_YEAR)) {
 
Angepasste Lösung:

Code:
Date parsedDate = sdf.parse(birthday);
GregorianCalendar cal = new GregorianCalendar();
int y, m, d, age;

y = cal.get(Calendar.YEAR);
m = cal.get(Calendar.MONTH);
d = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(parsedDate);
age = y - cal.get(Calendar.YEAR);
if ((m < cal.get(Calendar.MONTH))
		|| ((m == cal.get(Calendar.MONTH)) && (d < cal
				.get(Calendar.DAY_OF_MONTH)))) {
	--age;
}
if(age < 0)
	throw new IllegalArgumentException("Age < 0");
return age;
 
Ich habe auch mal daran rumgefeilt und letztendlich alles über den Haufen geworfen.

Habe einen von grundauf neuen Code geschrieben, der nun das Alter exakt berechnen sollte.

Anbei der Code

Code:
private int getAge(Date date)
	{
		GregorianCalendar birthd = new GregorianCalendar();
		birthd.setTime(date);
		
		GregorianCalendar today = new GregorianCalendar();
		
		int year = today.get(Calendar.YEAR) - birthd.get(Calendar.YEAR);
		
		if(today.get(Calendar.MONTH) <= birthd.get(Calendar.MONTH))
		{
			if(today.get(Calendar.DATE) < birthd.get(Calendar.DATE))
			{
				year -= 1;
			}
		}
		
		if(year < 0)
			throw new IllegalArgumentException("invalid age: "+year);
		
		return year;
	}
 
Tach zusammen,

mir ist da noch nen kleiner Fehler aufgefallen!! Jetzt sollte es stimmen ;).

Zum Glück habe ich Copy, Paste gemacht UND drüber nachgedacht :p.

Java:
public int getAlter()
    {
        GregorianCalendar geburtstag = new GregorianCalendar();
        geburtstag.setTime(getGeburtsdatum());

        GregorianCalendar heute = new GregorianCalendar();

        int alter = heute.get(Calendar.YEAR) - geburtstag.get(Calendar.YEAR);

        if (heute.get(Calendar.MONTH) < geburtstag.get(Calendar.MONTH))
        {
            alter = alter - 1;
        }
        else if (heute.get(Calendar.MONTH) == geburtstag.get(Calendar.MONTH))
        {
            if (heute.get(Calendar.DATE) <= geburtstag.get(Calendar.DATE))
            {
                alter = alter - 1;
            }
        }

        return alter;
    }

Grüße ketrt
 

Neue Beiträge

Zurück