Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Java - Liegt Geburtstag in Zeitraum


Webo - Do 01.12.11 13:51
Titel: Java - Liegt Geburtstag in Zeitraum
Hallo,

ich habe grade das Problem, dass ich prüfen soll, ob ein Kunde zwischen dem Anfangs- und Enddatum Geburtstag hatte. Falls ja, wird ihm was gutgeschrieben. Das ganze ist in Java gelöst. Ich dachte zuerst: ja, ist ja einfach, kann man einfach mit den vorgegebenen Methoden prüfen, ob das Datum dazwischen liegt. Doch das Geburtsjahr funscht da ja zwischen. Also setze ich temporär das Geburtsjahr hoch. Aber da treten wieder so viele Möglichkeiten auf, die Fehler erlauben.

Ich habe im Moment:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
@SuppressWarnings("deprecation")
  public void checkBirthdays() {
    for (Customer c : customerList) {
      Date birthd = c.getBirthday();
      Date prv = VideoRentalManager.getInstance().getPreviousDate();
      Date cur = VideoRentalManager.getInstance().getCurrentDate();
      
      if (prv.getYear() == cur.getYear()) {
        birthd.setYear(cur.getYear());
        if (cur.after(birthd) && prv.before(birthd))
          c.setHasFreeMovie(true);
      }
      
      if ((cur.getYear() > prv.getYear() ) && 
                            (birthd.getMonth() >= prv.getMonth()) && 
                            (birthd.getDate() >= prv.getDate())) {
        birthd.setYear(prv.getYear());
        if (cur.after(birthd) && prv.before(birthd))
          c.setHasFreeMovie(true);
      } else
        if ((cur.getYear() > prv.getYear() ) && 
                                    (birthd.getMonth() <= cur.getMonth()) && 
                                    (birthd.getDate() <= cur.getDate())) {
          birthd.setYear(cur.getYear());
          if (cur.after(birthd) && prv.before(birthd))
            c.setHasFreeMovie(true);
        }


Gibts da nen einfacheren Weg? Bzw liefert der Code überhaupt die passenden Ergebnisse?


Bergmann89 - Do 01.12.11 15:25

Hey,

ich bin kein Java-Profi, aber warum wandelst du die Daten nicht einfach in ein UNIX-Zeitstempel um? (siehe hier [http://www.tutorials.de/java/262723-datum-unix-timestamp-konvertieren.html]) Dann kannst du das ganze einfach mit < und > vergleichen. Ich glaube man kann die Java-Date-Typen auch direkt miteinander vergleichen, da bin ich mir aber grad nicht sicher.

MfG Bergmann.


baka0815 - Do 01.12.11 16:04

Bei Java gibt's auf jeden Fall die Funktion getTimeInMillis oder so ähnlich, mit der du ein long zurückbekommst.

Aber reicht nicht folgendes?

C#-Quelltext
1:
2:
3:
4:
5:
  int birDate = birthd.getMonth() * 100 + birthd.getDay();
  int curDate = cur.getMonth() * 100 + cur.getDay();
  int prvDate = prv.getMonth() * 100 + prv.getDay();

  c.setHasFreeMovie(prvDate <= birDate && birDate <= curDate);


Edit: Reicht nicht, siehe meine Beispiele unten.


Webo - Do 01.12.11 16:06

Das Problem ist, dass ich das Geburtstagsdatum ja erstmal passend bekommen muss (glaub ich zumindestens).

Beispiel:
aktuelles Datum 1.12.2011
vorheriges Datum 25.11.2011
Geburtstag 2.10.1978

Da kann ich in Sekunden/Timestamp umwandeln, aber dann wird er nie in dem Zeitraum Geburtstag haben. Und die Jare weglassen kann man ja auch nicht, da sonst das Ergebnis verfälscht wird.


baka0815 - Do 01.12.11 16:16


Quelltext
1:
2:
3:
Aktuell: 01.12.2011
Vorher : 25.11.2011
Geburt : 02.10.1978


In diesem Beispiel hätte er keinen Freifilm, da er nicht im Zeitraum Geburtstag hat.


Quelltext
1:
2:
3:
Aktuell: 01.12.2011
Vorher : 25.09.2011
Geburt : 02.10.1978


In diesem Beispiel hätte er einen Freifilm, da er im Zeitraum Geburtstag hat.


Quelltext
1:
2:
3:
Aktuell: 01.07.2011
Vorher : 25.09.2010
Geburt : 02.10.1978


In diesem Beispiel hätte er einen Freifilm, da er im Zeitraum Geburtstag hat.

Im Prinzip brauchst du ja nur prüfen, ob der Kunde in diesem Jahr bereits Geburtstag hatte (birthd.getMonth() * 100 + birthd.getDay() <= cur.getMonth() * 100 + cur.getDay()). Wenn ja, setzt du das Jahr auf das aktuelle, sonst auf das Vorjahr.

Und dann einfach:

C#-Quelltext
1:
  c.setHasFreeMovie(prv.before(birthd) && birthd.before(cur));