Wie kann man Alter berechnen

Hallo Leute,

ich kämpfe damit alter zu berechnen. Ich habe in nur so geschafft. ist das ok so oder könnt ist Tipps geben, damit ich besser berechnen kann?


	public static void main(String[] args) {
		GregorianCalendar tag = new GregorianCalendar();

		GregorianCalendar gebJahr = new GregorianCalendar(1976,
				Calendar.JANUARY, 1);
		
		long ms = gebJahr.getTimeInMillis();
		
		long days = TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis()-ms);
		
		System.out.println(days/365);
	}

}

ich muss eine Methode getAlter machen und komme ich nicht dazu wie ich das machen soll

Danke euch
Anni

Also wenn die Berechnung in Deinem Beispielcode funktioniert sind folgende Schritte nötig:

Dein Berechnung im Parameter von System.out.println() in eine lokale Variable extrahieren:... alter = a/b; System.out.println(alter)dann schreibst Du nach der main-Methode eine neue Methode:

  • die Zeile 3 kopieren.
  • das Wort “void” duch den Typ des Rechnungsergebnisses ersetzen
  • das Wort “main” duch den neuen Namen ersetzen,
  • dien inhalt der Runden Klammern löschen,
  • eine schließende geschweifte Klammer dazu fügen.

Jetzt verschiebst Du die Zeilen 4 bis 12 (inklusife der neuen Variable aber ohne das System.out…) in die neue Methode.

in der neuen Methode ersetzt Du ... alter = a/b;durch return a/b;
in der Main schreibst Du jetzt den Namen der neuen Methode anstelle von alter:System.out.println(neuerName());

bye
TT

wow Java berechnet so die Zeit ? Bin selber Java nup aber

System.out.println(days/365);

sollte nicht 100% korrekt arbeite wgn Schaltjahren. Aber ansich

Aktuelles Jahr - Geburtsjahr =Alter (+1 wenn Monat >Geburtsmonat || Monat == Geburtsmonat && Tag >= Geburtstag )

müsste in korrektes Ergebnis liefern

[QUOTE=nimda]wow Java berechnet so die Zeit ?Bin selber Java nup aber

System.out.println(days/365);

sollte nicht 100% korrekt arbeite wgn Schaltjahren.[/QUOTE]Das eingesetzte GregorianCalendar bietet da noch einiges mehr an Komfort, aber ich habe das Post selbst anders verstanden als dessen Überschrift.

bye
TT

tut mir leid, ich saß Stundenlang darauf und wollte nur noch hier fragen, damit ich vorankomme

ich bin zu diese Lösung gekommen. es sind folgende Probleme, bei baujahr.getYear() wird gehtYear() durchgestrichen(monat und tag auch) und warum wird dem baujahr.getYear(), 1900 abgezogen?

public class Fahrzeug {

	
	private Date baujahr;
	

	public Fahrzeug( Date baujahr) {
	
		setBaujahr(baujahr);
		
	}

	
	Date getBaujahr() {
		return baujahr;
	}

	void setBaujahr(Date baujahr) {
		this.baujahr = baujahr;
	}

	
	public long getAlter() {
		Date d1 = new Date(baujahr.getYear() - 1900, baujahr.getMonth(),
				baujahr.getDay());
		Date now = new Date();
		long timeInMillis = now.getTime() - d1.getTime();
		long years = timeInMillis / 1000 / 60 / 60 / 24 / 365;
		return years;

	}
}


public static void main(String[] args) throws ParseException {
		Fahrzeug auto = new Fahrzeug(new Date(1980,8,4));
		System.out.println(auto.getAlter());
	}

[QUOTE=anni80]tut mir leid, ich saß Stundenlang darauf und wollte nur noch hier fragen, damit ich vorankomme

ich habe gelesen, dass man mit getimt() milisekunden berechnen kann, von milisekunden wurde ich auf tage umwandeln, aber sogar Millisekunden sind negativ[/QUOTE]Wieso willst Du das unbedingt über die Milisekunden machen?
Schon der zweite Treffer in Google brachte mich hier hin und Code im Post vom 23.08.12 16:40 sieht doch ziemlich sinnfällig aus…

[QUOTE=anni80;20824]wenn ich hier baujahr erzeuge wird Date durchgestrichen[/QUOTE]Weil dieser Konstruktor nicht mehr verwendet werden soll. Er ist “depricated”.

bye
TT

danke für den Link, habe ich auch gesehen, aber konnte ich nicht zu meine methode anpassen

Endlich hat es geklappt, aber ich verstehe folgende Zeilen nicht. Ich habe versucht methoden in 11. und 15. zeile mit der reinenfolgen rauszukommenzieren, aber habe gesehen, dass beide wichtig waren. warum ist die methode auf der 11. zeile wichtig, da ich den konstruktor ehe string übergebe?

public class Alterberechnen {

	Date baujahr;

	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");

	public Alterberechnen(String date) throws Exception {
		setBaujahr(date);
	}

	private void setBaujahr(Date date) {
		baujahr = date;
	}

	private void setBaujahr(String date) throws Exception {
		setBaujahr(sdf.parse(date));

	}

	public int age() {
		GregorianCalendar cal = new GregorianCalendar();
		int y, d, a;

		y = cal.get(cal.YEAR);
		d = cal.get(cal.DAY_OF_YEAR);
		cal.setTime(birthdate);
		a = y - cal.get(cal.YEAR);
		if (d < cal.get(cal.DAY_OF_YEAR)) {
			--a;
		}
		return (a);
	}

	public static void main(String args[]) throws Exception {
		Alterberechnen h;

		h = new Alterberechnen("1980.08.22");

		System.out.println(h.age());
		System.exit(0);
	}
}

Danke euch Anni

[QUOTE=anni80]Endlich hat es geklappt, aber ich verstehe folgende Zeilen nicht. Ich habe versucht methoden in 11. und 15. zeile mit der reinenfolgen rauszukommenzieren, aber habe gesehen, dass beide wichtig waren. warum ist die methode auf der 11. zeile wichtig, da ich den konstruktor ehe string übergebe?
[/QUOTE]
Ich bin in Java nicht firm, aber “baujahr” kann per String oder Datentyp Date gesetzt werden.
Das wirkt für mich nicht ausgegoren(oder wurde es nur halb kopiert?).

h = new Alterberechnen(“1980.08.22”);
Da fehlt aber (für mich noch)
h = new Alterberechnen(“variable vom Typ Date”);

jetzt hat es so geklappt.
ich habe eine setBaujahr(Date date) gelöscht und andere so überschrieben

private void setBaujahr(String date) throws Exception {
		this.baujahr=sdf.parse(date);

	}

ich weiß nicht ob ich das nochmal schreiben kann, wenn ich alterberechnen brauchen werde ;(

Mit schaltjahre wäre noch interessant

gut dass mir Timothy_Truckle zu den Link noch hingewiesen hat. Nach stundenlange Bastelei liefert es richtige Ergebnis

Anni

Zeiten solltenn in jeder Progammirsprache so frü wie möglich in den dafür vorgesehenen Datentyp gewandelt werden. das ist eine technische Aufgabe und gehört nicht in eine fachliche Klasse wie diese. Bitte ändere den Konstruktorparameter zu Date.

Setter-Methoden gehören nur in reine Datenklassen, die keine eigene Logik haben. In “normalen” Klassen ist die Änderung von Eigenschaften nur eigenen Methoden erlaubt. zB: für die Geschwindigkeit de Autos sollte es keine Setter-Methode geben, sondern eine Methode zum Beschleunigen und eine zum bremsen…

Und ein Setter für das Baujahr kann eigentlich nur für Verkäufer wichtig sein…

;o)

bye
TT

[QUOTE=Timothy_Truckle;21096]Zeiten solltenn in jeder Progammirsprache so frü wie möglich in den dafür vorgesehenen Datentyp gewandelt werden. das ist eine technische Aufgabe und gehört nicht in eine fachliche Klasse wie diese. Bitte ändere den Konstruktorparameter zu Date.
[/QUOTE]

Also das heißt, dass ich vorherige Lösung vergessen soll oder? ich bin wirklich fleißig am lernen und wenn ich lerne möchte ich richtig lernen und deswegen frage ich so oft nach

public class Alterberechnen {

	Date setBaujahr;

	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");

	public Alterberechnen(Date date) throws Exception {
		this.setBaujahr = date;
	}

	private Date getBaujahr() {
		return setBaujahr;

	}

	public int age() {
		GregorianCalendar baujahr = new GregorianCalendar();
		baujahr.setTime(getBaujahr());

		GregorianCalendar heute = new GregorianCalendar();

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

		return alter;

	}

	public static void main(String args[]) throws Exception {
		Alterberechnen h;

		h = new Alterberechnen(new Date(80, 8, 3));
		System.out.println(h.age());
		System.exit(0);
	}
}

Wenn die Lösung gut ist, was kann man mit diese Problem machen h = new Alterberechnen(new Date(80, 8, 3)); wo new Date durchgestrichen ist?

danke euch Anni

Heißt das dass ich auf setter möglichst meiden muss und sollte ich der Attribut in Konstruktor mit this übergeben?
aber getter soll man für jede attribut nehmen, damit der von überall zugreifbar ist?

Anni

[QUOTE=anni80]Also das heißt, dass ich vorherige Lösung vergessen soll oder? ich bin wirklich fleißig am lernen und wenn ich lerne möchte ich richtig lernen und deswegen frage ich so oft nach

Wenn die Lösung gut ist, was kann man mit diese Problem machen h = new Alterberechnen(new Date(80, 8, 3)); wo new Date durchgestrichen ist?

danke euch Anni[/QUOTE]

Ein Dateobject erzeugst du besser uebe eine DateFormat
Dieses Object kannst du dann an deine Alterberechnen übergeben

Also ich muss den konstruktor doch String übergeben oder?

[QUOTE=anni80]Heißt das dass ich auf setter möglichst meiden muss und sollte ich der Attribut in Konstruktor mit this übergeben?[/QUOTE]Im Allgemeinen: ja. Aber das ist kein Dogma. Manchmal sind Setter/Getter sinvoll. Aber das sind Ausnahmen, die man gut begruünden können muss.

[QUOTE=anni80;21180]aber getter soll man für jede attribut nehmen, damit der von überall zugreifbar ist?[/QUOTE]Nein. Die Properties eines Obkekts gehen kein anderes Objekt etwas an. Das ist eines der wichtigsten Prinzipien der OOP: “Information Hiding”. Wenn ein Property geändert werden muss stellt das Objekt eine entsprechende Methode bereit, die von anderen Objekten genutz wird.

bye
TT

[QUOTE=anni80]Also ich muss den konstruktor doch String übergeben oder?[/QUOTE]Nein.
Die Umwandlung eines Strings mit einem Datum zu einem Date-Objekt erfolg sofort nachdem er in das Program eingelesen wurde, egal ob das aus der Console, einem Gui-Element oder einem Netztwerk-Stream kommt. Dein fachliches Objekt darf sich nicht darum kümmern müssen, in welchem Format das Datum in das Program importiert wurde, also beispielsweise ob das Datum im deutschen Format (“02.08.2013” oder “2. August 2013”) oder im amerikanischen Format (“Aug 2nd 13”) eingegeben wurde.

Was der Ägypter meinte ist, dass der von Dir verwendete Konstruktor von Date nicht mehr benutzt werden soll und man statt dessen DateFormat mit einem lesbaren String verwendet.

bye
TT

Hey,

new Date(80, 8, 3)

ist veraltet, der Konstruktor wurde in Calender bzw. GregorianCalender ersetzt. Das heißt also, dass du kein Objekt von Typ Date mit diesem Konstruktor anlegen sollst. Näheres findest du dazu in der Dokumentation, die zu verwendenden Konstruktoren findest du dort auch.

http://docs.oracle.com/javase/7/docs/api/java/util/Date.html

setter möglichst meiden

Was heißt möglichst meiden, es gibt ja Fälle wo du die Instanzvariable eines Objektes nachträglich manipulieren musst. Dafür benötigst du dann eine setMethode.

Ein kleines Beispiel:
Du hast eine Klasse Auto, diese enthält die private Instanzvariable „baujahr“. Über den Zuweisungskonstruktor der Klasse Auto weist du der Instanzvariable „baujahr“ einen Wert zu.
Eine setMethode für Baujahr ist nicht nötig, da sich das Baujahr eines Autos nicht ändert. Es wird einmal beim erzeugen gesetzt und dann bleibt es bestehen. Hier wäre maximal eine getMethode nötig wenn man das Baujahr mal auslesen will.

Erweitern wir die Klasse Auto nun um eine weitere Instanzvariable „halter“. Die Instanzvariable „halter“ ist private und wird beim erzeugen eines Objektes mit Hilfe des Zuweisungskonstruktor belegt. Im Gegensatz zum Baujahr eines Autos kann sich der Halter des Autos schon ändern und das nicht nur einmal. Also benötigt man eine Methode die es ermöglicht auf die private Instanzvariable „halter“ zuzugreifen um diese ändern zu können. Also, braucht man eine public setMethode um den Halter im nachhinein zu ändern.

Zum Schluss noch ein kleiner Hinweis:

Die Variable setBaujahr ist schlecht gewählt, nimm lieber baujahr. Wenn etwas mit „set“ oder „get“ anfängt dann sollten es Methoden sein die zum auslesen oder manipulieren von private Datenelementen bestimmt sind.

Danke, jetzt verstehe ich diese Zeug besser.

Das mit Datum werde ich so lassen und weitermachen, sonst werde ich Java und programmieren hassen. Nach einpaar Monate zu Thema zurückkommen

Danke euch nochmals. Da ich allein lerne und niemanden zum helfen habe, ist mir eure Hilfe sehr viel wert

Anni

Man könnte diese Methode für den Halter auch einfach „wechsleHalter“ nennen, eventuell sind noch andere Sachen damit verbunden die dann in der Methode abgehandelt werden könnten.
So könnte man ein „setHalter“ als überschreiben der variablen deuten und ein „wechseleHalter“ als ein füge ihn zur Liste von Haltern hinzu, wobei der alte Halter als inaktiv gesetzt wird :wink:

Wegen der Variablen „setBaujahr“ wurde ja schon gennant, das diese eher „baujahr“ heissen sollte
Allgemein steht es hier gut erklärt wie die Konventionen dazu sind
http://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner

Klassen und Interfaces
Erster Buchstabe immer groß
„CamelCase“ anwenden. Wenn mehrere Worte in einem Identifier verbunden werden, sollten die Anfangsbuchstaben groß geschrieben werden.
Für Klassen Nomen verwenden (Hund, Katze…)

Methoden
erster Buchstabe immer klein.
„camelCase“ anwenden.
Methodennamen sollten Kombinationen aus Verben und Nomen darstellen. So kann am besten beschrieben werden, wozu die Methode dient. Gute Beispiele findet man natürlich in der Java API.
Bsp.: getTasche(), fuelleTasche( … )

Variablen
wie bei Methoden „camelCase“ und erster Buchstabe immer klein.

Deine „age“-Methode, berechnet das Alter und gibt sie zurück. Da würde ich sie eher „berechneAlter“ oder „calcAge“ nennen.