Geburtstag im Schaltjahr berechnen

Ernsti

Mitglied
Hi, ich programmiere gerade so eine Art Countdown, wer als nächstes Geburtstag hat.

Sagen wir, es hat jemand am 29.2. Geburtstag und heute ist der 10.3. ... In wie vielen Tagen hat diese Person dann das nächste Mal Geburtstag?

Wie berechne ich das?

Danke =)
 
Vielleicht noch schnell, wie ich es bishere berechne:

Java:
    public double getProgressBarValue(long nowTime) {
        return (double) (time - nowTime) / (1000 * 60 * 60 * 24);
    }

Java:
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(date);
                    if (hasYear) {
                        years = currentYear - cal.get(Calendar.YEAR);
                    }
                    cal.set(Calendar.YEAR, currentYear);
                    cal.set(Calendar.HOUR_OF_DAY, 12);
                    if (cal.before(nowCal)) {
                        cal.set(Calendar.YEAR, currentYear + 1);
                        years++;
                    }
                    contacts1.add(new Element(cal.getTimeInMillis(), name);

getProgressBarValue gibt dabei die Anzahl der Tage bis zum nächsten Gebrutstag zurück.

date ist der Geburtstag in diesem Jahr.

currentYear ist das aktuelle Jahr.

nowCal ist der aktuelle Zeitpunkt.

Hat vielleicht jemand ein Plan?
 
Etwas in der Richtung:
Java:
public int daysUntil(MonthDay birthday) {
    LocalDate today = LocalDate.now();

    int year = today.getYear();
    if (birthday.atYear(year).isBefore(today)) {
        year++;
    }
    return (int) ChronoUnit.DAYS.between(today, birthday.atYear(year));
}
 
return (int) ChronoUnit.DAYS.between(today, birthday.atYear(year));
Die Berechnung der Differenz hatte ich eigentlich schon (das hättest du an dem Snippet erkennen können), ChronoUnit wollte ich vermeiden, meine Frage zielte dahingehend, was passierte, wenn jemand am 29.2. Geburtstag hat... oder anders: Wie weit können ein und der darauffolgende Geburtstag auseinander liegen?
 
ChronoUnit wollte ich vermeiden
Wenn man etwas vermeiden will, dann sind das Date und Calendar.

wenn jemand am 29.2. Geburtstag hat... oder anders: Wie weit können ein und der darauffolgende Geburtstag auseinander liegen?
Das kommt natürlich darauf an, wie man das sehen will, aber prinzipiell endet ein Lebensjahr mit Ablauf des Tages, der dem Geburtstag vorangeht. Bist Du am 1. März geboren, endet das Lebensjahr mit Ablauf des 28. bzw. 29. Februar. Bist Du am 29. Februar geboren, endet das Lebensjahr mit Ablauf des 28. Februars.
 
Insofern müsste die Methode so aussehen:
Java:
public int daysUntil(MonthDay birthday) {
    LocalDate today = LocalDate.now();
    int year = today.getYear();
    LocalDate birthdayDate = birthday.atYear(year).plusDays(birthday.isValidYear(year) ? 0 : 1);
    if (birthdayDate.isBefore(today)) {
        birthdayDate = birthdayDate.plusYears(1);
    }

    return (int) ChronoUnit.DAYS.between(today, birthdayDate);
}
 
Wenn man etwas vermeiden will, dann sind das Date und Calendar.
Nönö, ChronoUnit und die neue Date API sind leider verhunzt worden... und es bestand auch gar keine Notwendigkeit, etwas an der Calendar API zu ändern...

Ich bleibe bei Date und Calendar.

Du hast leider meine Frage nicht beantwortet, was 29.3. + 1 Jahr ergibt.
 
Du hast leider meine Frage nicht beantwortet, was 29.3. + 1 Jahr ergibt.
Das war nicht Deine Frage:

1. Frage
es hat jemand am 29.2. Geburtstag und heute ist der 10.3. ... In wie vielen Tagen hat diese Person dann das nächste Mal Geburtstag?
Habe ich Dir in #3 Code geliefert.

2. Frage
was passierte, wenn jemand am 29.2. Geburtstag hat...
Habe ich Dir in #4 beantwortet und in #5 Code geliefert (der aber nur für den 29.2. gilt)

3. Frage
was 29.3. + 1 Jahr ergibt.
Wieder den 29.3., was sonst?
 
Du hast leider meine Frage nicht beantwortet, was 29.3. + 1 Jahr ergibt.
Die Frage ist relativ unsinnig, da einfach nicht eindeutig.

29.3 ist einfach nur ein Tag / Monat Stempel. Da kann man kein Jahr dazu addieren. Du hast einfach ein Tag / Monat Stempel, der unverändert bleibt.


Sobald Du ein Datum hast (das dann auch ein Jahr enthält), dann kann man da auch ein Jahr dazu addieren. Die Übliche Definition ist dann, dass Tag / Monat gleich bleiben und die Jahreszahl um eins erhöht wird. Bleibt nur der Sonderfall des Schaltjahrs. Und da wurde durchaus drauf eingegangen. (Und der ist durchaus wichtig, denn eine Tag/Monat Kombination mag es dann in vielen Jahren schlicht geben 🙂 )

Bezüglich der Klassen: Hier kann man mehrere Ansätze wählen:

a) Spezifisch auf einen Einsatz: Haben die Klassen die Funktionalität, die Du brauchst? Wenn dem so ist, dann nutze diese Klasse und freue dich. Wenn die Klasse die benötigte Funktionalität nicht bietet, dann muss man sich nach etwas anderem umschauen.

b) Generelle Betrachtung: Bei den Projekten, die so umgesetzt wurden und werden: Gibt es da Probleme mit einer Klasse? Wird etwas anderes benötigt? Wenn eine Klasse nicht die geforderte Funktionalität bietet, dann ist der übliche Ansatz, dass man Klassen schreibt, die die notwendige Funktionalität haben.

Ohne es im Detail diskutieren zu wollen:
Bezüglich der Date / Time Klassen von Java vor Java 8 gab es gewisse Probleme. Und da gab es dann Lösungen wie z.B. Joda Time https://www.joda.org/joda-time/
Das Problem wurde aber auch erkannt und daher wurde mit Java 8 eine API eingeführt, die diverse Dinge besser macht.

Aber ob die neue API für Dich auch Vorteile bringt oder nicht, das kannst nur Du entscheiden. Da diese aber nicht grundlos angelegt wurden, ist es durchaus sinnvoll diese zu kennen.

Heisst das, dass wir uns jede weitere Antwort sparen können?
 
Nönö, ChronoUnit und die neue Date API sind leider verhunzt worden... und es bestand auch gar keine Notwendigkeit, etwas an der Calendar API zu ändern...

Ich bleibe bei Date und Calendar.

Du hast leider meine Frage nicht beantwortet, was 29.3. + 1 Jahr ergibt.
Java:
 LocalDate date = LocalDate.of(2022, 3, 29);
        LocalDate todaysDate = LocalDate.now();

        date = date.plusYears(1);
        long ergebnis  = todaysDate.until(date, ChronoUnit.DAYS);
        System.out.println(ergebnis);
262

Code:
        LocalDate date = LocalDate.of(2019, 3, 29);
        LocalDate todaysDate = LocalDate.of(2019, 3, 29);

        date = date.plusYears(1);
        long ergebnis  = todaysDate.until(date, ChronoUnit.DAYS);
        System.out.println(ergebnis);
366
 
Zuletzt bearbeitet:
Sagen wir, es hat jemand am 29.2. Geburtstag und heute ist der 10.3. ... In wie vielen Tagen hat diese Person dann das nächste Mal Geburtstag?

wenn man es genau nimmt in 1461 - die 10 Tage im März also 1451 Tage.

vorausgesetzt wir sind in einen Schalt Jahr
 
wenn man es genau nimmt in 1461 - die 10 Tage im März also 1451 Tage.
Nein, denn es geht um abgeschlossene Lebensjahre. @mihe7 hat das ja doch schon ausgeführt.

Da @mihe7 keine Quellen genannt hat, möchte ich dazu einfach noch etwas nachlegen. In Deutschland wäre dies z.B. §187, das dies ganz offiziell regelt (Da geht es um Fristen und ausdrücklich auch Geburtstage.
 
es wird der 1.3. benutzt in Deutschland also 355 Tage im Schaltjahr sonst 356
ich meine aber das er meinte in wie viel Tagen es wider einen 29.2. gibt.
 
Zuletzt bearbeitet:
Ich möchte gerne nochmal das Problem schildern...

Java:
import java.util.Calendar;

public class Birt {
    public static void main(String[] args) {
        final long nowTime = System.currentTimeMillis();
        System.out.printf("%.04f%n", daysBetweenBirthday(nextBirthday(Calendar.JULY, 9, nowTime), nowTime));
        System.out.printf("%.04f%n", daysBetweenBirthday(nextBirthday(Calendar.JULY, 10, nowTime), nowTime));
        System.out.printf("%.04f%n", daysBetweenBirthday(nextBirthday(Calendar.JULY, 11, nowTime), nowTime));
        System.out.printf("%.04f%n", daysBetweenBirthday(nextBirthday(Calendar.JULY, 12, nowTime), nowTime));
    }

    public static long nextBirthday(int month, int day, long nowTime) {
        Calendar nowCal = Calendar.getInstance();
        nowCal.setTimeInMillis(nowTime);
        int currentYear = nowCal.get(Calendar.YEAR);
        Calendar birthday = Calendar.getInstance();
        birthday.set(currentYear, month, day, 12, 0, 0);
        if (nowCal.after(birthday)) {
            birthday.set(Calendar.YEAR, currentYear + 1);
        }
        return birthday.getTimeInMillis();
    }

    public static double daysBetweenBirthday(long nextBirthday, long nowTime) {
        return (double) (nextBirthday - nowTime) / (1000 * 60 * 60 * 24);
    }

    public static double maxDaysBetweenBirthday() {
        return 999; // ?
    }
}

Was sollte die Methode maxDaysBetweenBirthday zurückgeben, wie viele Tage können zwischen zwei Geburtstagen liegen? Ich brauche diesen Wert für den Maximalwert der ProgressBar. =)
 
Was sollte die Methode maxDaysBetweenBirthday zurückgeben, wie viele Tage können zwischen zwei Geburtstagen liegen? Ich brauche diesen Wert für den Maximalwert der ProgressBar. =)
a) Wie groß ist die Abweichung bei 365 und 366 als MAX-Wert. Ich vermute, dass die Abweichung von ggf. ca. 0,3 - 0,4% von einem User nicht bemerkt wird. Daher ist die Frage, in wie weit hier wirklich ein Bedarf besteht oder ob man das einfach konstant als 366 annehmen kann.

b) Dein Code ist extrem unleserlich - da hatte ich jetzt keine wirkliche Lust, das nachzuvollziehen. Aber wenn ich das richtig überflogen habe, dann hast Du die Möglichkeit, die Anzahl der Tage zwischen zwei Tagen zu ermitteln. Also kannst Du die Anzahl der Tage zwischen dem kommenden und den vergangenen Geburtstag ermitteln und dann weisst Du, ob es 365 oder 366 Tage sind.
 
heucheln konntest du schon immer gut. 😉 Bodenlose Frechheit Deine Behauptungen.
Ok, Du findest deinen Code also besonders lesbar und gut. Will ich nicht weiter vertiefen zumal @mrBrown ja gezeigt hat, dass er Deinen Account immer sofort sperrt so dass eine Diskussion auch sehr schwer würde ...

Wir haben aber gerade kein Schlatjahr. Wusstest du das schon?
Das ist relevant aus welchem Grund? Weil derzeit kein Schaltjahr ist, muss man das nicht berücksichtigen? Da Dein Code bis zum nächsten Schaltjahr eh niemanden mehr interessieren wird?

Und ich habe vorgeschlagen, die Anzahl der Tage zwischen zwei Geburtstagen zu ermitteln. Wenn da bei Dir 0, 1, ... 363, 364 heraus kommt, dann solltest Du den Code ggf. noch einmal im Detail prüfen. Das sollte entweder 365 oder 366 sein. Jedes andere Ergebnis ist ganz offensichtlich falsch. (Wobei das doch toll ist .... wenn 0 Tage zwischen zwei Geburtstagen sind, dann kann man jeden Tag Geburtstag feiern!)
 
Immer = seit 50 min? Oder ist das etwa wieder einer der vielen Accounts....
Ja, Tobias scheint bei @mrBrown grade "KoS" (Kill on Sight) zu sein. Diese neue Account zeigt deutlich, dass der alte gesperrt wurde. Und dank so netter Antworten gab es halt wieder ein Report von wegen Bällespieleparadies ...

Werde eh gleich gesperrt, ist egal wie ich antworte^^
Nein, wenn Du einfach vernünftig antworten würdest statt direkt Kommentare persönlich zu nehmen, dann wäre es evtl. nicht so. Wobei Du Dich halt schon extrem verbrannt hast.

manchmal zweifle ich auch an deinem IQ... starte das Snippet, dann siehst du die genaue Ausgabe.
Das ist doch das beste Beispiel. Dabei geht es mir nicht einmal um die Beleidigung. Ich habe versucht, die eine Hilfestellung zu geben. Aber Du versuchst noch nicht einmal, diese zu verstehen.

Du ermittelst im aktuellen Code die Anzahl der Tage zwischen heute und dem nächsten Geburtstag. Mein Hinweis war aber:
Also kannst Du die Anzahl der Tage zwischen dem kommenden und den vergangenen Geburtstag ermitteln
Dein Problem ist also schlicht, dass Du nicht einmal versuchst, die Hilfe zu verstehen, die man versucht Dir zu geben. Und das ist vermutlich auch der Grund, warum man Dir keine weitere Chance mehr geben will. Das ist für mich nicht nachvollziehbar! Zumal diese ganze Thematik doch von der Komplexität her einfach ist. Daher ist wirklich die Frage, ob Du "unser" "TobiasNRW" von damals bist oder um wir hier schon eine Sammlung von solchen Leuten haben ... Denn der hatte damals doch wenigstens etwas drauf ... aber die Problematik hier hat doch nicht wirklich irgend eine besondere Komplexität... Aber das ist mir auch egal. Du hast ein Problem genannt, ich habe versucht, Dir eine Lösungsidee zu nennen. Diese scheinst Du abzulehnen. Ist ok.
 

Zurück
Oben