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 =)
 

Ernsti

Mitglied
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?
 

mihe7

Top Contributor
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));
}
 

Ernsti

Mitglied
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?
 

mihe7

Top Contributor
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.
 

mihe7

Top Contributor
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);
}
 

Ernsti

Mitglied
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.
 

mihe7

Top Contributor
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?
 

KonradN

Top Contributor
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?
 

Jw456

Top Contributor
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:

Jw456

Top Contributor
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
 

KonradN

Top Contributor
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.
 

Jw456

Top Contributor
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:

lulul

Mitglied
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. =)
 

KonradN

Top Contributor
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.
 

lulul

Mitglied

KonradN

Top Contributor
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!)
 

KonradN

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Geburtstag aller Angestellten am bestimmten Datum Java Basics - Anfänger-Themen 59
Lion.King Schaltjahr berechnen Java Basics - Anfänger-Themen 31
J Schaltjahr Java Basics - Anfänger-Themen 6
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
R Schaltjahr problem Java Basics - Anfänger-Themen 10
Dawinartor Erste Schritte Schaltjahr berechnen Java Basics - Anfänger-Themen 1
S Compiler-Fehler Schaltjahr berechnen Java Basics - Anfänger-Themen 5
P Schaltjahr: "sauberer" Code Java Basics - Anfänger-Themen 4
C Schaltjahr Java Basics - Anfänger-Themen 4
T Wenn Schaltjahr ist, soll Februar, einen Tag mehr haben, GUI mit combobox Java Basics - Anfänger-Themen 4
B Schaltjahr überprüfen (Code) Java Basics - Anfänger-Themen 4
U Java Quellcode Schaltjahr Java Basics - Anfänger-Themen 13
G Schaltjahr Java Basics - Anfänger-Themen 6
W Schaltjahr abbrechen wenn <1583 Java Basics - Anfänger-Themen 11
W Schaltjahr Berechnung Java Basics - Anfänger-Themen 24
S schaltjahr (gelöst zu 90 %), allerdings folgeprob :/ Java Basics - Anfänger-Themen 18
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
I Zuschläge berechnen Java Basics - Anfänger-Themen 15
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
L Präfix berechnen Java Basics - Anfänger-Themen 33
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
I Potenz berechnen mit for-Schleife Java Basics - Anfänger-Themen 3
A Standardabweichung in Java berechnen Java Basics - Anfänger-Themen 10
H Gesamtabweichung mit Array berechnen Java Basics - Anfänger-Themen 2
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
V Rückgeld berechnen Java Basics - Anfänger-Themen 6
eleonori Durchschnitt aller Werte eines Baums berechnen Java Basics - Anfänger-Themen 5
Ianatrix Zahlen von a bis b berechnen Java Basics - Anfänger-Themen 7
L Max, min, Summe und Durchschnitt berechnen Java Basics - Anfänger-Themen 4
L Anhalteweg berechnen Java Basics - Anfänger-Themen 6
Aeon Erste Schritte Preise berechnen mit do-while Java Basics - Anfänger-Themen 9
M Quadratwurzel berechnen Java Basics - Anfänger-Themen 8
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Abschreibungsplan berechnen Java Basics - Anfänger-Themen 23
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
J Array Speicherplatz berechnen Java Basics - Anfänger-Themen 35
H Eingabedaten berechnen Java Basics - Anfänger-Themen 9
B Tranportkosten berechnen mit unterschiedlichen MwSt Java Basics - Anfänger-Themen 9
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
N Ein Datum berechnen Java Basics - Anfänger-Themen 3
T Sparplan berechnen Java Basics - Anfänger-Themen 4
F Abstand zum Durchschnitt von 5 Zahlen berechnen... Java Basics - Anfänger-Themen 16
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
P Mittelwert Arrayelemente berechnen Fehler Java Basics - Anfänger-Themen 5
CptK Best Practice Schussparabel berechnen Java Basics - Anfänger-Themen 3
T Modulo / Pow berechnen Java Basics - Anfänger-Themen 4
E Statistische Kennzahlen berechnen Java Basics - Anfänger-Themen 2
F Switch Case Modulo berechnen Java Basics - Anfänger-Themen 12
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
C Preis berechnen mit Java Java Basics - Anfänger-Themen 4
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
L Pi berechnen Java Basics - Anfänger-Themen 1
CptK Term (als String) berechnen und ausgeben Java Basics - Anfänger-Themen 10
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
J Variablen arithmetischen Mittelwert berechnen Java Basics - Anfänger-Themen 5
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
M Erste Schritte Mittelwert berechnen -> Methode in der Methode? Java Basics - Anfänger-Themen 14
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
R Liga Berechnen Java Basics - Anfänger-Themen 1
P Klassen Berechnen mehrerer Map-Werte Java Basics - Anfänger-Themen 13
R Fussballtabellen berechnen Java Basics - Anfänger-Themen 12
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
F ISBN Prüfziffer berechnen Java Basics - Anfänger-Themen 17
F Die Teilersumme einer Eingabe berechnen Java Basics - Anfänger-Themen 11
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
G Array Mittelwert berechnen, wie? Java Basics - Anfänger-Themen 8
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
N Mit LocalDate alter berechnen Java Basics - Anfänger-Themen 3
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
A Wochentag berechnen Java Basics - Anfänger-Themen 10
Ste3et_C0st Vectoren berechnen Java Basics - Anfänger-Themen 8
L Durchschnitt in der Schleife berechnen Java Basics - Anfänger-Themen 11
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
L Wochentag berechnen Java Basics - Anfänger-Themen 5
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
V Mittelwert berechnen Java Basics - Anfänger-Themen 31
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
P Quadrate berechnen Java Basics - Anfänger-Themen 3
S OOP Datumsunterschied in Tagen berechnen Java Basics - Anfänger-Themen 3
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben