# Eine Liste mit Geburtsdaten und Alter berechnen.



## StillerRegen (30. Oktober 2018)

Hey Lieber Leser, 

ich habe ein kleines Problem bezüglich dem Geburtstag, 
ich habe in einer Datenbank, den Geburtstag, Geburtsmonat und Geburtsjahr, die möchte ich nun in eine separate Liste packen, um dann Später, wenn einer Geburtstag hat, das Alter zu berechnen. 

Weiß jemand wie das gehen könnte?


```
ArrayList<MonthDay> Geburtstag = new ArrayList<MonthDay>();

while (rs.next()) {
                int gday = rs.getInt("psn_geburtstag");
                int gmonth = rs.getInt("psn_geburtsmonat");
                int gyear = rs.getInt("psn_geburtsjahr");


               " Hier muss es Hinzugefügt werden, aber wie?"
```


----------



## vfl_freak (30. Oktober 2018)

Moin,
Du speicherst also Tag, Monat und Jahr als separate Werte? (warum?)
Dann willst Du aus diesen drei Werten ein Datumsformat bilden??
Was ist _MonthDay_ ??



StillerRegen hat gesagt.:


> " Hier muss es Hinzugefügt werden, aber wie?"


Was genau soll das bedeuten?
Was heißt "hier"??

VG Klaus


----------



## StillerRegen (30. Oktober 2018)

Moinsen, 

Weil ich sage ich mal von Mehreren Personen das Geburtsdatum habe, mir ist vorerst keine andere Lösung eingefallen. 
Ja, ich könnte es natürlich schon davor, die Daten sind ja in der Datenbank hinterlegt, dann müssten die nur noch als Date heraus gelesen werden.
MonthDay ist eine Typ wie Integer, String etc. nur wie der Name schon sagt, speicherst du damit Monat und Tag, 

Mit "Hier" meine ich, dass dort die Geburtsdaten in die Liste reingepackt werden.


----------



## vfl_freak (30. Oktober 2018)

Moin,


StillerRegen hat gesagt.:


> ich könnte es natürlich schon davor, die Daten sind ja in der Datenbank hinterlegt, dann müssten die nur noch als Date heraus gelesen werden.


Das wäre schon mal eine Möglichkeit, die ich immer bevorzugen würde (wobei man halt nicht weiß, wie die Daten VOR dem Speichern bei Dir vorliegen!)



StillerRegen hat gesagt.:


> MonthDay ist eine Typ wie Integer, String etc. nur wie der Name schon sagt, speicherst du damit Monat und Tag


Ah, ok, kannte ich noch nicht - habe ich aber aber auch nopch nie vermisst 
Suchst Du vlt. sowas: http://www.java2s.com/Tutorials/Java/java.time/MonthDay/MonthDay.of_int_month_int_dayOfMonth_.htm



StillerRegen hat gesagt.:


> Mit "Hier" meine ich, dass dort die Geburtsdaten in die Liste reingepackt werden.


hmm, wenn Du dort Deine Monthday-Objekte erzeugt hast, dann fügst Du sie halt zur Arraylist hinzu ...
https://www.tutorialspoint.com/java/util/arraylist_add_index.htm

So richtig verstehe ich Dein Problem noch immer nicht 

VG Klaus


----------



## StillerRegen (30. Oktober 2018)

Die Daten sind in einer Datenbank als Integer Gespeichert also: 

Du hast drei Spalten Geburtstag, Geburtsmonat, Geburtsjahr alle als Integer, 

Mein Problem ist, dass ich das Jahr nicht dazu bekomme, ich bekomme lediglich den Monat und den Tag, was mir erlaubt nachzufragen, ob die Person heute Geburtstag hat oder nicht Yippie Yahu, aber ich kann das Alter nicht berechnen, da ich das Geburtsjahr dafür brauche.


----------



## vfl_freak (30. Oktober 2018)

Dann nimm' halt nicht *MonthDay* als Typ !!??!!??


----------



## StillerRegen (30. Oktober 2018)

Was soll ich dann nehmen? 

ArrayList<Date>? 

Aber ich kann diese dann nicht mit add. hinzufügen weil Date und Integer nicht Hamonieren.


----------



## vfl_freak (30. Oktober 2018)

Moin,

Stichworte: DateTime, DateTimeFormatter ...
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
https://docs.oracle.com/javase/tutorial/datetime/iso/format.html
https://stackoverflow.com/questions/42175899/java-8-datetimeformatter

Und wie liegen denn nun die Daten vor dem Speichern vor?
Auch als Integer??

VG Klaus


----------



## vfl_freak (30. Oktober 2018)

BTW: weil *MonthDay* kein _Jahr _enthält habe ich es auch noch nie benutzt !! 

Für ältere Java-Versionen gäbe es auch noch: https://www.joda.org/joda-time/

VG Klaus


----------



## StillerRegen (30. Oktober 2018)

Ja die Daten liegen als Integer vor. 

Habe beides Probiert, 

ArrayList<Date> als auch ArrayList<DateFormat> probiert, und beides gibt mir nur Non-Sense aus....


```
ArrayList<Date>   Geburtstag = new ArrayList<Date>();

while(rs.next()){
                Date gday = rs.getDate("Geburtstag");
                Date gmonth = rs.getDate("Geburtsmonat");
                Date gyear = rs.getDate("Geburtsjahr");
                
                Geburtstag.add(gday);
                Geburtstag.add(gmonth);
                Geburtstag.add(gyear);
                
                System.out.format("%s,%s,%s\n", gday,gmonth,gyear);
            }
```


----------



## vfl_freak (30. Oktober 2018)

Moin,

was gibt dir Dein SysOut oben denn aus ??

Hast Du auch schon https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html versucht??



StillerRegen hat gesagt.:


> ArrayList<Date> als auch ArrayList<DateFormat> probiert, und beides gibt mir nur Non-Sense aus....


was sollen wir mit DER Angabe anfangen ???
Was genau hast Du versucht (mit Code) und was kam raus ??

VG Klaus


----------



## StillerRegen (30. Oktober 2018)

Es gibt mir das aus:

1970-01-01,1970-01-01,1970-01-01
1970-01-01,1970-01-01,1970-01-01
1970-01-01,1970-01-01,1970-01-01
1970-01-01,1970-01-01,1970-01-01
1970-01-01,1970-01-01,1970-01-01

Mit LocalDateTime:


```
ArrayList<LocalDateTime>   Geburtstag = new ArrayList<LocalDateTime>();


while(rs.next()){
                LocalDateTime gday1 = rs.getDate("psn_geburtstag");  -->TypeMismatch: cannot convert from Date to LocalDate
                LocalDateTime gmonth2 = rs.getDate("psn_geburtsmonat"); --> Ebenfalls
                LocalDateTime gyear3 = rs.getDate("psn_geburtsjahr"); --> Ebenfalls
                
                Geburtstag.add(gday1);
                Geburtstag.add(gmonth2);
                Geburtstag.add(gyear3);
                
                System.out.format("%s,%s,%s\n", gday1,gmonth2,gyear3);
            }
```


----------



## StillerRegen (30. Oktober 2018)

Andere Frage: 

Kann ich eine ArrayList<Integer> in Date/LocalDate etc. Konvertieren?


----------



## vfl_freak (30. Oktober 2018)

Moin,


StillerRegen hat gesagt.:


> Kann ich eine ArrayList<Integer> in Date/LocalDate etc. Konvertieren?


ein klares: kommt darauf an 
Ein _int_-Wert kann durchaus einen konkreten Zeitpunkt in Form eines _Date _repräsentieren!

Ist Dir überhaupt, wie die unterschiedlichen Datumsformate/-typen aufgebaut sind ??
https://docs.oracle.com/javase/8/docs/api/java/util/Date.html
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Es gibt also für alles Konvertierungen, die musst Du allerdings ggf. händisch durchführen!
Eine einfache Zuweisung reicht da in *KEINEM* Fall !!

Vielleicht postest Du mal den Aufbau der Tabelle und auch mehr Code (und zwar bitte immer aktuell, wenn Du was ausprobiert hast) !!
Diese ganze Rätselraterei bringt doch nix!!

VG Klaus


----------



## Bratkartoffel (30. Oktober 2018)

Hi,

nur mal so am Rande, weiss nicht ob ich es überlesen habe:

```
Date gday = rs.getDate("Geburtstag");
Date gmonth = rs.getDate("Geburtsmonat");
Date gyear = rs.getDate("Geburtsjahr");
```

Warum speicherst du jedes Feld (Tag, Monat, Jahr) in einzelnen Spalten der Tabelle?
Warum nimmst du nicht *eine* Spalte mit Typ "DATE", anstatt 3x "INT"?

Wenn du schon INT als Typ hast, musst du die Daten auch so aus dem ResultSet rausziehen:

```
int gday = rs.getInt("Geburtstag");
int gmonth = rs.getInt("Geburtsmonat");
int gyear = rs.getInt("Geburtsjahr");

LocalDate birthday = LocalDate.of(gyear, gmonth, gday);
```

Und das Alter einer Person kannst du übrigens auch von MySQL berechnen lassen, das musst du nicht in Java machen:
https://stackoverflow.com/a/19522129/1164913

Grüsse,
BK

// Edit: Natürlich nicht "getDate", sondern "getInt"...


----------



## StillerRegen (30. Oktober 2018)

Das ist die Tabelle

@Bratkartoffel

Hey


```
int gday = rs.getInt("Geburtstag");
int gmonth = rs.getInt("Geburtsmonat");
int gyear = rs.getInt("Geburtsjahr");

LocalDate birthday = LocalDate.of(gyear, gmonth, gday); -->The method of(int, int, int) is undefined for the type LocalDate
```


----------



## Bratkartoffel (30. Oktober 2018)

Hi StillerRegen,

siehe meinen Edit oben. Es muss natürlich getInt und nicht getDate heissen.

Grüsse,
BK


----------



## Bratkartoffel (30. Oktober 2018)

Du nimmst schon das "java.time.LocalDate" her, oder?
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#of-int-int-int-

Grüsse,
BK


----------



## StillerRegen (30. Oktober 2018)

Hey @Bratkartoffel 

Ja, habe es vergessen, habe org.Joda.time benutzt, habe da raus genommen und import java.time.LocalDate und es funktioniert.
Jetzt nur noch das Alter ausrechnen 

Auf jeden Fall vielen Dank.


----------



## HonniCilest (30. Oktober 2018)

StillerRegen hat gesagt.:


> Was soll ich dann nehmen?


https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#of-int-java.time.Month-int-
Du speicherst das Datum als LocalDate

Und dann kannst du den Geburtstag extrahieren (LocalDate ist ein TemporalAccessor)
https://docs.oracle.com/javase/8/do...tml#from-java.time.temporal.TemporalAccessor-

MonthDay kannst du dann verwenden um den heutigen Geburtstag zu identifizieren


----------

