Java - Liegt Geburtstag in Zeitraum
spacer
Autor Nachricht
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 536
Erhaltene Danke: 7

Win 7, Debian
Delphi 7 Enterprise, Delphi 2010 Pro
BeitragVerfasst: Do 01.12.11 13:51 
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:
ausblenden C#-Quelltext markieren
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?

_________________
Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1572
Erhaltene Danke: 50

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: 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) 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.

_________________
Ich weiß nicht viel lern aber dafür umso schneller^^
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: 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?
ausblenden C#-Quelltext markieren
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.


Zuletzt bearbeitet von baka0815 am Do 01.12.11 16:17, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Webo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 536
Erhaltene Danke: 7

Win 7, Debian
Delphi 7 Enterprise, Delphi 2010 Pro
BeitragVerfasst: 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.

_________________
Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Do 01.12.11 16:16 
ausblenden Quelltext markieren
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.

ausblenden Quelltext markieren
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.

ausblenden Quelltext markieren
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:
ausblenden C#-Quelltext markieren
1:
  c.setHasFreeMovie(prv.before(birthd) && birthd.before(cur));
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home