# Berechnung des aktuellen Alters auf Basis des Geburtstags



## jdlbgwd (6. Jun 2011)

Hallo liebe Java Profis,

ich habe eine kleines Problem und komme damit überhaupt nicht klar, da ich noch in den Kinderschuhen bei der Javaprogrammierung stecke.

Ich möchte bei Aufruf einer Mitgliederseite das aktuelle Alter ausgeben, auf Basis des Geburtstages und eben nicht das Geburtsdatum anzeigen.

Wer hat das schon einmal realisiert und kann mir da helfen oder gar den source code zur verfügung stellen ?

Vielen Dank
Jörg


----------



## Andi_CH (6. Jun 2011)

Erstens

Zweitens

Drittens

Runden auf ganze Jahre -> Vorher bei beiden Daten 1. Januar 0 Uhr 0 Minuten setzen
oder sonst etwas cleveres ausdenken (falls es um Geburtstage und Lebensalter geht ist der 1. Januar nicht die richtige Idee)


----------



## jdlbgwd (6. Jun 2011)

Danke für die Belehrung und den Kommentar über Komma und Groß- Kleinschreibung.

War eine super Schweizer Hilfe !


----------



## Andi_CH (6. Jun 2011)

Was für eine triefende Ironie wegen meiner Signatur - du hast ja keinen besonderen Grund dich betroffen zu fühlen. Wenn du in diesem und anderen Foren die Texte die so getippt werden ein wenig verfolgst, verstehst du sicher warum ich genau die benutze.

Antworten auf deine Fragen findest du über die google Links mehr als genug.
Solange du nicht signalisierst, dass du selbst schon nachgedacht hast wie das Problem zu lösen sein könnte und das vielleicht mit ein wenig selbstgeschriebendem Code untermauerst, wird kaum eine andere Art von Antworten kommen.


----------



## jdlbgwd (6. Jun 2011)

Ich denke, gerade ein Schweizer sollte sich nicht über die Deutsche Sprache auslassen.
Und ausserdem ist es heute fast üblich geworden, u. a. auch wegen der Schnelligkeit beim Tippen, in Foren oder überhaupt in der elektronischen Nachrichtenübermittlung nur noch klein zu schreiben.

Und nur so zur Information, ich habe bereits mehrere Stunden mit Nachlesen und Selbststudium damit zugebracht. Nur ich mache dies ehrenhalber und nicht beruflich.


----------



## nrg (6. Jun 2011)

ja ok. hast du dann auch noch eine frage?


----------



## maki (6. Jun 2011)

Was hast du denn bereits?

Andi hat seine Signatur schon länger so, kein Grund dass du das persönlich nimmst.

Bist du sicher dass du diesmal wirklich Java meinst und nicht wieder JavaScript?


----------



## SlaterB (6. Jun 2011)

jdlbgwd hat gesagt.:


> Nur ich mache dies ehrenhalber und nicht beruflich.


bemerkenswerte Bemerkung nebenbei, 
von deiner Seite natürlich absolut unnachprüfbar, nicht dass es eine große Rolle spielen würde,

für alle die dir hier antworten gilt das in Bezug auf die Antworten sowieso und zu 100% glaubhaft, 
denn wer sollte das hier bezahlen?


----------



## Asgar13 (6. Jun 2011)

Die Sachen in Klammern sind Pseudocode.

1. Hole dir das Datum (.getDate(); )
2. Verwandle das in einem String (.toString(); )
3. Schneide alle Stéllen, bis auf das Jahr weg (.substring(0,x); )
4. Hole dir das Jahr der Geburt(.getText(); )
5. JahrVonJetzt - Jahr der Geburt= Alter
6. Schreibe das Alter(.setText(); )

Andi_CH hat schon wirklich lange diese Signatur.


```
Ich denke, gerade ein Schweizer sollte sich nicht über die Deutsche Sprache auslassen.
```

Wenn du wirklich etwas gegen seine Signatur hast, schreibe ihn eine private Nachricht(Account), wo du deine Argumente hervorbringt, bitte noch in wohl artikulierten Ton.


----------



## faetzminator (6. Jun 2011)

Asgar13 hat gesagt.:


> 1. Hole dir das Datum (.getDate(); )
> [...]



Finde ich etwas verrückt. Einfach beide Daten in [c]Date[/c] (oder [c]GregorianCalender[/c]!?) einlesen, voneinander subtrahieren, die Jahre zurückgebenlassen.


----------



## nrg (6. Jun 2011)

vorallem funktioniert es so einfach nicht. man muss schon die monate und tage mit berücksichtigen, weil halt nicht jeder beim jahreswechsel sofort ein jahr älter wird


----------



## SlaterB (6. Jun 2011)

Date ist doch ein ganzes Datum, wieso nur die Jahre?
durch die berühmten Schaltjahre wirds vielleicht ein Tag zuwenig/zuviel oder ein Tag pro 4 Jahre (mit 40 schon 10 Tage) wenn man einfach nur durch 365 Tage teilt,
wovon auch immer man ausgeht, mit Calendar-Methoden nicht ganz so kritisch


----------



## jgh (6. Jun 2011)

da datums-arithmetik alles andere als trivial ist, kann man den TO doch ein wenig unter die Arme greifen?

hier ein kleiner, schneller -aber auch *"falscher"* Lösungsansatz-
zu beachten sei: *Die Monate beginnen bei 0 zu zählen und enden demensprechend bei 11 = Dezember!*

*Personen, die noch kein ganzes Jahr alt sind...werden trotzdem mit 1 Jahr angegeben!!!*



```
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Geburstag {

	private Calendar cal;

	public Geburstag(int jahr, int monat, int tag) {
		cal = new GregorianCalendar();
		cal.add(Calendar.YEAR, -jahr);
		cal.add(Calendar.MONTH, -monat);
		cal.add(Calendar.DAY_OF_MONTH, -tag);
		System.out.println("Sie sind " + cal.get(Calendar.YEAR) + " Jahre, "
				+ cal.get(Calendar.MONTH) + " Monate und "
				+ cal.get(Calendar.DAY_OF_MONTH) + " Tage alt.");
	}

	public static void main(String[] args) {
		new Geburstag(1999, 6, 3);//richtig
		new Geburstag(2011, 5, 3);//falsch
		new Geburstag(2010, 5, 3);//richtig
		new Geburstag(2010, 11, 3);//falsch
		new Geburstag(2009, 11, 3);//richtig
	}
}
```

Ausgabe:
[XML]Sie sind 11 Jahre, 11 Monate und 3 Tage alt.
Sie sind 1 Jahre, 0 Monate und 3 Tage alt.
Sie sind 1 Jahre, 0 Monate und 3 Tage alt.
Sie sind 1 Jahre, 6 Monate und 3 Tage alt.
Sie sind 1 Jahre, 6 Monate und 3 Tage alt.[/XML]


----------



## faetzminator (6. Jun 2011)

Mit Joda Time krieg ich...

```
Sie sind 11 Jahre, 12 Monate und 3 Tage alt.
Sie sind 0 Jahre, 1 Monate und 3 Tage alt.
Sie sind 1 Jahre, 1 Monate und 3 Tage alt.
Sie sind 0 Jahre, 7 Monate und 3 Tage alt.
Sie sind 1 Jahre, 7 Monate und 3 Tage alt.
```


----------



## jgh (6. Jun 2011)

> Sie sind 11 Jahre, *12 Monate* und 3 Tage alt.



also...Joda macht auch Mist 
und die 1-Monatsdifferenz resultiert wahrscheinlich daraus, dass Joda mit 1= Januar rechnet.

aber grundsätzlich ist mein Lösungsansatz verkehrt. Mit ein paar kleinen Work-arounds würde sich dann auch mit der Java-Standardbinliothek dieses Problemchen lösen lassen.


----------



## faetzminator (6. Jun 2011)

Ow ja, da hab ich was nicht richtig erkannt. Wenn man lediglich den Monat mit 1 subtrahiert, läufts --> man befindet sich von der Diff her im Monat "Dez", also im 12. Monat, dies ist aber bereits nach 11 und nicht 12 Monaten der fall. Aber da der Monat so oder so irrelevant ist (bzw. sein sollte)... Wenn ich das -1 mitrechne, dann stimmt eigentlich jeder Output. 
Also kann ich mit weniger Code etwas schreiben, das mit GregorianCalendar nicht funktioniert!?

```
public int getAge(int jahr, int monat, int tag) {
    return getAge(new DateTime(jahr, monat, tag, 0, 0, 0, 0));
}

public int getAge(final DateTime birthday) {
    DateTime now = new DateTime();
    return now.minusYears(birthday.getYear()).minusMonths(birthday.getMonthOfYear()).minusDays(
            birthday.getDayOfMonth()).getYear();
}
```


----------



## SlaterB (6. Jun 2011)

ja und? mit JFrame kann man in einer Zeile schreiben was ohne JFrame (und andere fertige APIs) 100.000 Zeilen Code braucht..,

wobei Calendar eben die Jahre 1 vor Christus, 1 nach Christus usw. zählt, 
wenn deine Joda-Zeit eine normale Zeitangabe und nicht speziell ein Intervall sein soll, dann finde ich 0 Jahre dort bedenklich..


----------



## faetzminator (6. Jun 2011)

0 Jahre n.Chr. ist doch ein gültiges Jahr!?


----------



## maki (6. Jun 2011)

Interessante Entwicklung, bin immer noch der Meinung das der TS mal wieder JavaScript meinte und nicht Java...


----------



## jgh (6. Jun 2011)

auch wenn dein Joda-Calendar mit wenig Code eine annährend richtige Ausgabe gibt...eigentlich müsste man doch, um das korrekte Alter wiedergeben zu können den Zeitraum zwischen Geburt und heute in den Focus nehmen, und nicht bspw vom Jahr 2011, 2000 Jahre abziehen!?
Ansonsten betrachtet man einen Zeitraum vom Jahre 0 bis zum Jahr X (~alter), was eigentlich nicht richtig sein kann.

Aber maki hat schon recht...wahrscheinlich meint der TO wirklich JavaScript...aber dort sollten doch solche, oder ähnliche Funktionen schon vorhanden sein...


----------



## Logaff (6. Jun 2011)

wie wärs einfach unixtimestamp von jetzt - unixtimestamp von damals ? denn hat man das in s glaub ich denn /(60*60*24*365) und schon sollte man die jahres differenz haben

code für aktuellen timestamp 

```
long timestamp = System.currentTimeMillis()/1000
```


----------



## SlaterB (6. Jun 2011)

faetzminator hat gesagt.:


> 0 Jahre n.Chr. ist doch ein gültiges Jahr!?


eine solche Frage stellt sich doch fast gar nicht sondern wird gleich nachgeschaut:
Jahr null ? Wikipedia

0 nach Christus geht gar nicht, 0 vor Christus schon was hier bei der Rechnung dann auch helfen würde

---

@Logaff
und dann eben Probleme mit Schaltjahren, nicht dass das bei der anderen Lösung unbedingt komplett beachtet wird


----------



## nrg (6. Jun 2011)

naja da wären wir wieder bei den schaltjahren...

so könnte man es evtl noch machen:

```
public static int getAge(int day, int month, int year) {
		String[] a = new SimpleDateFormat("dd.MM.yyyy").format(new Date()).split("\\.");
		int age = Integer.parseInt(a[2]) - year;
		return month >= Integer.parseInt(a[1]) && day > Integer.parseInt(a[0]) ? age - 1 : age;
	}
```


----------



## faetzminator (6. Jun 2011)

Ja, da gibts [c]Duration[/c] u.ä. in Joda Time. Musste noch nie damit arbeiten, also kann ich auch nichts genaueres dazu aussagen. Gibts da auch was vergleichbares in der Std API?
Aber das GregorianCalender kein Jahr 0 - Joda Time aber schon - kennt, finde ich etwas komisch.


----------



## T7V (6. Jun 2011)

Müsste man dann nicht sowieso noch die Umstellung zwischen gregorianischen und julianischen Kalender im  Oktober 1582 beachten?


----------



## Andi_CH (6. Jun 2011)

```
cal = new GregorianCalendar();
System.out.println("Heute ist der " + cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH));
```

Ausgabe: 2011-*5*-6  na ja - dass das allenfalls subobtimal ist brauch ich ja wohl nicht zu betonen. Die ganze Gregorianische Welt zählt anders

Anmerkung "heute" ist der 6. Juni 2011 - kann ja sein, dass das jemand erst in 11 Monaten liest 

hm und weitere mehr als eigenartige Efekte gibt es auch:

```
cal = new GregorianCalendar();
cal.add(Calendar.YEAR, -cal.get(Calendar.YEAR));
sysout(jahr);// ist ja klar was gmeint ist
```

Ausgabe *1* ???:L ???:L ???:L


----------



## nrg (6. Jun 2011)

das haben wir jetzt schon ein paar mal gehört... java ist halt allgemein zero-based. das bei monaten auch so handzuhaben halte ich aber zugegeben auch für etwas unpassend aber wenn man es weiß, ist das doch halb so wild...


----------



## Jens81 (6. Jun 2011)

T7V hat gesagt.:


> Müsste man dann nicht sowieso noch die Umstellung zwischen gregorianischen und julianischen Kalender im  Oktober 1582 beachten?



So alt sind allerdings die wenigstens User.


----------



## Andi_CH (6. Jun 2011)

Sicheres Auftreten bei völliger Ahnungslosigkeit

hi hi - find ich immer speziell  Weisst du denn überhaupt was du von dir gibst 
Ist schon klar - ich hab ja auch "suboptimal" geschrieben.

Das was ich noch dazu editiert habe ist aber wohl schwieriger zu begreifen.


----------



## SlaterB (6. Jun 2011)

um die Jahre ging es doch vorher schon in diesem Thread?


----------



## nrg (6. Jun 2011)

Andi_CH hat gesagt.:


> Weisst du denn überhaupt was du von dir gibst



das frag ich mich bei dir irgendwie permanent... die punkte, die du grad ansprichst, wurden schon 20 posts zuvor durchgekaut.


----------



## Andi_CH (6. Jun 2011)

Haben heute alle zu heiss??? Erst der, der sich über meine uralte Signatur aufregt und jetzt noch das. Zum Glück bin ich heute gutmütig gesinnt, aber ich kann auch kleinlich tun. Deines war der 31. Post - 20 gibt 11 das war der da

Kleinlichkeit weg - ich finde wirklich im ganzen Tread keinen Hinweis darauf warum 2011 - 2011 = 1 geben soll.


----------



## Crian (6. Jun 2011)

Andi_CH hat gesagt.:


> Haben heute alle zu heiss???



Ja *schwitz*


Ich finde den Start bei 0 für Monate auch seltsam, aber das ist in einigen Sprachen (oder Bibliotheken), die ich kenne, so. Ich frage mich, ob man mit den Tagen nicht auch bei 0 anfangen sollte. 0-30. Chaos ist vorprogrammiert!


----------



## SlaterB (6. Jun 2011)

Andi_CH hat gesagt.:


> Haben heute alle zu heiss???


zum Glück diesmal ich nicht alleine 


> Kleinlichkeit weg - ich finde wirklich im ganzen Tread keinen Hinweis darauf warum 2011 - 2011 = 1 geben soll.



http://www.java-forum.org/java-basi...llen-alters-basis-geburtstags.html#post770432


jgh hat gesagt.:


> *Personen, die noch kein ganzes Jahr alt sind...werden trotzdem mit 1 Jahr angegeben!!!*


und dann gehts danach bald weiter


----------



## jgh (6. Jun 2011)

> ich finde wirklich im ganzen Tread keinen Hinweis darauf warum 2011 - 2011 = 1 geben soll.


weil es kein Jahr 0 gibt...zumindest nach der Impementation des java.util.GregorianCalendar

```
public static void main(String[] args) {
		Calendar cal = new GregorianCalendar();
		cal.set(Calendar.YEAR, 1);
		cal.set(Calendar.ERA, 0);
		cal.set(Calendar.MONTH, 11);
		cal.set(Calendar.DAY_OF_MONTH, 29);
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
		for (int i = 0; i < 5; i++) {
			System.out.println();
			cal.add(Calendar.DAY_OF_MONTH, 1);
			System.out.print(cal.getTime()+"\t"
					+ sdf.format(cal.getTime())
					+ ((cal.get(Calendar.ERA) == 1) ? " AD|nach Christus"
							: " BC|vor Christus"));
		}

	}
```

[XML]Thu Dec 30 16:55:51 CET 1	30.12.0001 BC|vor Christus
Fri Dec 31 16:55:51 CET 1	31.12.0001 BC|vor Christus
Sat Jan 01 16:55:51 CET 1	01.01.0001 AD|nach Christus
Sun Jan 02 16:55:51 CET 1	02.01.0001 AD|nach Christus
Mon Jan 03 16:55:51 CET 1	03.01.0001 AD|nach Christus[/XML]


----------



## jdlbgwd (6. Jun 2011)

Ich war heute Nachmittag nicht online und so habe ich erst jetzt die ganzen Kommentare dazu gelesen.

Also in JavaScript habe ich es nicht hinbekommen und bin davon ausgegangen, dass man dies, gerade in Bezug auf die Schaltjahre, auch in JavaScript nicht machen kann.

Daher wollte ich es in Java schreiben. Das zu dem Thema ob ich Script meinte oder nicht.

Nun zu den ganzen anderen Bemerkungen, mir ist es egal wie lange einer eine Signatur hat, wenn Sie ein wenig mehr als daneben ist. Dann bekommt er eben eine passende Antwort dazu.

Ebenso die dummen Bemerkungen dazu, ob man das glauben soll oder nicht, dass ich dies nur nebenbei mache. Wenn ich das beruflich machen würde und dann dies nicht hinbekomme, dann sollte ich mir mein Geld zurück geben lassen und einen neuen Job suchen. Alleine aus der Tatsache heraus solltewohl klar sein, dass ich hier wirklich nur eine Lösung für einen kleinen Verein suche.

Aber ich will hier keine weitere hitzige Diskussion auslösen und sage Danke und hoffe jeder hat etwas durch die Diskussion des Lösungweges dazu gelernt.

Ich weniger, da ich ehrlich nur die Hälfte verstanden habe. Verdiene mein Geld nunmal mit anderen Dingen und so wird es auch bleiben.

Ich werde das jetzt eben bezahlen und programmieren lassen.

MfG
Jörg


----------



## T7V (6. Jun 2011)

Jens81 hat gesagt.:


> So alt sind allerdings die wenigstens User.



Meinte ich nur, weil es vorhin auch irgendwie ums Jahr 0 ging.

Eben dieses Umrechnen zwischen JK und GK, Berechnung des Wochentages und die Berechnung zwischen zwei Daten (mittels modifiziertes julianisches Datum(oder so ähnlich)) musste ich im letzten Semester implementieren.


----------



## faetzminator (6. Jun 2011)

jdlbgwd hat gesagt.:


> Ich werde das jetzt eben bezahlen und programmieren lassen.



Hauptsache ein Bisschen rummotzen und alle interessanten Antworten ignorieren und im Nachhinein jemanden bezahlen? Geschieht dir ganz recht.
Es gibt hier bei genauerem Hinsehen eine Lösung, welche funktioniert und nur noch reinkopiert werden müsste. Bei einer solchen Antwort, hab ich aber überhaupt keine Lust, dir diese zu verraten - hoffentlich irgendwie verständlich...


----------



## nrg (6. Jun 2011)

in javascript könnte das so aussehen (ungetestet):



```
function getAge(birthdate) {
	var now = new Date();
	var age = now.getFullYear() - birthdate.getFullYear();
	return birthdate.getMonth() >= now.getMonth() && birthdate.getDate() > now.getDate() ? age - 1 : age;
}
```


----------



## jdlbgwd (6. Jun 2011)

faetzminator hat gesagt.:


> Hauptsache ein Bisschen rummotzen und alle interessanten Antworten ignorieren und im Nachhinein jemanden bezahlen? Geschieht dir ganz recht.
> Es gibt hier bei genauerem Hinsehen eine Lösung, welche funktioniert und nur noch reinkopiert werden müsste. Bei einer solchen Antwort, hab ich aber überhaupt keine Lust, dir diese zu verraten - hoffentlich irgendwie verständlich...



Ersten habe ich nicht rumgemotzt, ich habe eine sehr kritische Bemerkung zu einer Signatur gemacht, sorry das ich Signaturen die in Nachrichten an mich stehen noch lese und diese auch auf mich beziehe. 

Ich ignoriere garnichts, scheinbar liest Du nicht alles was ich geschrieben habe. Ich habe sehr wohl alles durchgelesen und auch versucht die Zusammenhänge in Java nachzuvollziehen, aber auch ehrlich geschrieben, dass ich nur die Hälfte verstanden habe. Demnach kann ich KEINE Lösung zum hineinkopieren gefunden haben.

Du solltest erst überlegen und dann schreiben !

Und nun Ende mit diesem Thread.


----------



## nrg (6. Jun 2011)

jdlbgwd hat gesagt.:


> sorry das ich Signaturen die in Nachrichten an mich stehen noch lese und diese auch auf mich beziehe.


ich würde nicht alles in einem forum persönlich nehmen und vorallem nicht die signaturen 



jdlbgwd hat gesagt.:


> Demnach kann ich KEINE Lösung zum hineinkopieren gefunden haben.


demnach hast du nicht richtig gelesen. jetzt haste auch ne Lösung in JS, obwohl das absolut nichts in Java Basics zu suchen hat (ob sie funktioniert, ist die zweite frage )


----------



## awda23ws23 (6. Jun 2011)

jdlbgwd hat gesagt.:


> Ich war heute Nachmittag nicht online und so habe ich erst jetzt die ganzen Kommentare dazu gelesen.
> 
> Also in JavaScript habe ich es nicht hinbekommen und bin davon ausgegangen, dass man dies, gerade in Bezug auf die Schaltjahre, auch in JavaScript nicht machen kann.
> 
> ...




Genial, nicht den Unterschied zwischen Java und Javascript kennen - und sich auch nicht mal informieren-, aber den schluß,ziehen, wenns mit Javascript nicht geht, dann mit Java. 
Und wo lassen wir dann das Java ablaufen?? Im Apache Webserver bei dem 0 EUR Hoster...

Wir funktioniert das heutzutage?
Wer einen Computer hat ist automatisch Hardware-Spezialist?
Wer einen Internetzugang hat ist automatisch Internetprogrammierer?


----------



## Jango (6. Jun 2011)

Kein Thread dieser Art ohne mich!!!!



jdlbgwd hat gesagt.:


> Wenn ich das beruflich machen würde und dann dies nicht hinbekomme, dann sollte *ich mir mein Geld* zurück geben lassen und...



Du bezahlst dich selber fürs Labern? 

Warum greifst du einen Schweizer an, der vernünftig schreiben kann? Du kannst es offensichtlich nicht.


----------



## jgh (6. Jun 2011)

Mein  Code  funktioniert, bis auf das Säuglinge, oder Babys unter einem Lebensjahr nicht korrekt angezeigt werden.

Dieser  Code  funktioniert auch, mit der Joda-Bibo...und sogar ein JS-Code hast du bekommen...und wir nichtmal ein Danke ;(


----------



## faetzminator (6. Jun 2011)

jdlbgwd hat gesagt.:


> Ich ignoriere garnichts, scheinbar liest Du nicht alles was ich geschrieben habe. Ich habe sehr wohl alles durchgelesen und auch versucht die Zusammenhänge in Java nachzuvollziehen, aber auch ehrlich geschrieben, dass ich nur die Hälfte verstanden habe. Demnach kann ich KEINE Lösung zum hineinkopieren gefunden haben.



Wenn du aber etwas weniger Zeit für genervte Postings deiner- und andererseits aufwenden würdest, dann könntest du bei unklaren Codestücken uns fragen. Für das sind wir alle nämlich hier.
Auch wenn nrg's Code ohne eine schöne Methode (seitens API) funktioniert - dieser gibt immer das korrekte Ergebnis zurück. Dieser hat er sowohl für Java und JS gepostet.


----------



## maki (6. Jun 2011)

So, da nun wirklich jeder seine Meinung sagen durfte, mach ich hier mal zu.

*geschlossen*


----------

