Gregorianischer Kalender und dessen Tage.

sserio

Bekanntes Mitglied
Zurzeit bearbeite ich eine Aufgabe, in der ich Tage herausfinden soll und dabei den gregorianischen Kalender benutzen. Meine Frage wäre wieso er beim ersten Datum nicht Freitag ausgibt, sondern Dienstag.
package gregorianischerKalender;


package gregorianischerKalender;

public class Test {
public static void main(String[] args) {
Datum datum = new Datum("15.10.1582");
Datum datum1 = new Datum("01.01.2000");
Datum datum2 = new Datum("22.10.2011");
Datum datum3 = new Datum("29.02.2014");


}
}


public class Datum {

private String datum;
private int day;
private int month;
private int year;

public Datum(String datum) {
this.datum = datum;

try {
day = Integer.parseInt(datum.substring(0, 2));
} catch (NumberFormatException e) {
System.out.println("No numbers!");
}
try {
month = Integer.parseInt(datum.substring(3, 5));
} catch (NumberFormatException e) {
System.out.println("No numbers!");
}
try {
year = Integer.parseInt(datum.substring(6, 10));
} catch (NumberFormatException e) {
System.out.println("No numbers!");
}


validDate();
getDay();
}


/**
* check if the year is a leapYear
* 1900 is not a leap year
* durch 4 teilbar=true, durch 100 teilbar = false,durch 400 teilbar =true
*
* @Return true if leapYear
*/
public boolean isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 4 == 0 && year % 400 == 0||year%400==0&&year%100==0) {
return true;
}
return false;
}

public void getDay() {
int counter = 77;
counter+= day;
int one=31,two=28,three=31,four=30,five=31,six=30,seven=31,eight=31,nine=30,ten=31,eleven=30;

String tag = "";
for (int i = 1583; i != year; i++) {
if (!isLeapYear(i)) {
counter += 365;
} else if (isLeapYear(i)) {
counter += 366;
}
}
if (!isLeapYear(year)) {
if(month==2){counter+=one;}
if(month==3){counter+=one+two;}
if(month==4){counter+=one+two+three;}
if(month==5){counter+=one+two+three+four;}
if(month==6){counter+=one+two+three+four+five;}
if(month==7){counter+=one+two+three+four+five+six;}
if(month==8){counter+=one+two+three+four+five+six+seven;}
if(month==9){counter+=one+two+three+four+five+six+seven+eight;}
if(month==10){counter+=one+two+three+four+five+six+seven+eight+nine;}
if(month==11){counter+=one+two+three+four+five+six+seven+eight+nine+ten;}
if(month==12){counter+=one+two+three+four+five+six+seven+eight+nine+ten+eleven;}
}
if (isLeapYear(year)) {
if(month==2){counter+=one;}
if(month==3){counter+=one+two+1;}
if(month==4){counter+=one+two+three+1;}
if(month==5){counter+=one+two+three+four+1;}
if(month==6){counter+=one+two+three+four+five+1;}
if(month==7){counter+=one+two+three+four+five+six+1;}
if(month==8){counter+=one+two+three+four+five+six+seven+1;}
if(month==9){counter+=one+two+three+four+five+six+seven+eight+1;}
if(month==10){counter+=one+two+three+four+five+six+seven+eight+nine+1;}
if(month==11){counter+=one+two+three+four+five+six+seven+eight+nine+ten+1;}
if(month==12){counter+=one+two+three+four+five+six+seven+eight+nine+ten+eleven+1;}

}


if (counter % 7 == 0) {
tag += "Der Tag am " + datum + " ist Freitag";
}
if (counter % 7 == 1) {
tag += "Der Tag am " + datum + " ist Samstag";
}
if (counter % 7 == 2) {
tag += "Der Tag am " + datum + " ist Sonntag";
}
if (counter % 7 == 3) {
tag += "Der Tag am " + datum + " ist Montag";
}
if (counter % 7 == 4) {
tag += "Der Tag am " + datum + " ist Dienstag";
}
if (counter % 7 == 5) {
tag += "Der Tag am " + datum + " ist Mittwoch";
}
if (counter % 7 == 6) {
tag += "Der Tag am " + datum + " ist Donnerstag";
}
System.out.println(tag);
}

public void validDate() {
if (year > 2022 || year == 2022 && month > 1 || year == 2022 && month == 1 && day > 25) {
throw new IllegalArgumentException("The current date is 25.01.2022. Your entry can't be above this date!");
}
if (year < 1582 && month < 10 && day < 15) {
throw new IllegalArgumentException("The date is under the start of the Gregorian calendar. It started with the date 15.10.1582 .");
}
if (datum.length() != 10) {
throw new IllegalArgumentException("Write the date in the format dd.MM.yyyy .");
}
if (month > 12) {
throw new IllegalArgumentException("The month can't be higher than 12.");
}
if ((month == 2 || month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
throw new IllegalArgumentException("In the months Fe,Ap,Jun,Sep and Nov can't be more than 30 days.");
}
if (day > 31) {
throw new IllegalArgumentException("There can't be more than 31 days in a month.");
}
if (datum.charAt(2) != '.' || datum.charAt(5) != '.') {
throw new IllegalArgumentException("Write the date in the format dd.MM.yyyy .");
}

for (int i = 0; i <= datum.length() - 1; i++) {
boolean b = datum.charAt(i) >= 48 && datum.charAt(i) <= 57 || datum.charAt(i) == '.';
if (!b) {
throw new IllegalArgumentException("The only thing that can be typed in with the format dd.MM.yyyy are the numbers 0-9 or a\".\".");
}//Beispiel

}
if (!isLeapYear(year) && month == 2 && day == 29) {
throw new IllegalArgumentException(+year + " is a leap year, what means that there are 29 days in february");
}

}

}
 

pkm

Bekanntes Mitglied
Ich verstehe nicht, wieso Du das als Exception wirfst, dass es sich dabei um ein Schaltjahr handelt. Ist das explizit in der Aufgabe so vorgegeben?
 

LimDul

Top Contributor
Zurzeit bearbeite ich eine Aufgabe, in der ich Tage herausfinden soll und dabei den gregorianischen Kalender benutzen. Meine Frage wäre wieso er beim ersten Datum nicht Freitag ausgibt, sondern Dienstag.
Du rechnest 77 + Die Zahl der Tage bis zum 15.10.1582 zusammen.

Das ist mit ziemlicher Sicherheit falsch, weil der 15.10 ja vermutlich 0 oder 1 entspricht bzgl. der Anzahl Tage, weil es der Tag des gregorianischen Kalenders ist.

Du brauchst, so wie du es aktuell gebaut hast, eine Sonderbehandlung für das Jahr 1582
 

pkm

Bekanntes Mitglied
Ist es sinnvoll in getDay()
Java:
int counter = 77;
in
Java:
int counter = year != 1582 ? 77 : 73;
umzuschreiben?
 

sserio

Bekanntes Mitglied
package gregorianischerKalender;

public class Datum {

private String datum;
private int day;
private int month;
private int year;

public Datum(String datum) {
this.datum = datum;
try {
day = Integer.parseInt(datum.substring(0, 2));
month = Integer.parseInt(datum.substring(3, 5));
year = Integer.parseInt(datum.substring(6, 10));
} catch (NumberFormatException e) {
System.out.println("No valid numbers!");
}
validDate();
getDay();
}

public boolean isLeapYear(int year) {
if (year%4==0&&year!=0||year%400==0&&year%100!=0 ) {
return true;
}
return false;
}

public void getDay() {
int counter = year!=1582 ? 77:73;
String tag = "";
for (int i = 1583; i < year - 1; i++) {
if (isLeapYear(i)) {
counter += 366;
} else if (!isLeapYear(i)) {
counter += 365;
}
}
int[] monthDays = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
for (int j = 1; j < month - 1; j++) {
counter += monthDays[j];
}
if (month == 2 && isLeapYear(year)) {
counter++;
}
counter+= day;



if (counter % 7 == 0) {
tag += "Der Tag am " + datum + " ist Freitag";
}
if (counter % 7 == 1) {
tag += "Der Tag am " + datum + " ist Samstag";
}
if (counter % 7 == 2) {
tag += "Der Tag am " + datum + " ist Sonntag";
}
if (counter % 7 == 3) {
tag += "Der Tag am " + datum + " ist Montag";
}
if (counter % 7 == 4) {
tag += "Der Tag am " + datum + " ist ein Dienstag";
}
if (counter % 7 == 5) {
tag += "Der Tag am " + datum + " ist ein Mittwoch";
}
if (counter % 7 == 6) {
tag += "Der Tag am " + datum + " ist ein Donnerstag";
}
System.out.println(tag);
}

public void validDate() {
if (year > 2022 || year == 2022 && month > 1 || year == 2022 && month == 1 && day > 25) {
throw new IllegalArgumentException("The current date is 25.01.2022. Your entry can't be above this date!");
}
if (year < 1582 && month < 10 && day < 15) {
throw new IllegalArgumentException("The date is under the start of the Gregorian calendar. It started with the date 15.10.1582 .");
}
if (datum.length() != 10) {
throw new IllegalArgumentException("Write the date in the format dd.MM.yyyy .");
}
if (month > 12) {
throw new IllegalArgumentException("The month can't be higher than 12.");
}
if ((month == 2 || month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
throw new IllegalArgumentException("In the months Fe,Ap,Jun,Sep and Nov can't be more than 30 days.");
}
if (day > 31) {
throw new IllegalArgumentException("There can't be more than 31 days in a month.");
}
if (datum.charAt(2) != '.' || datum.charAt(5) != '.') {
throw new IllegalArgumentException("Write the date in the format dd.MM.yyyy .");
}
if (!isLeapYear(year) && month == 2 && day == 29) {
throw new IllegalArgumentException(+year + " is a leap year, what means that there are 29 days in february");
}

}

}

Ich habe es jetzt bisschen verkürzt, sehe aber den sinn dieser "Fancy If-Bedingung " nicht
 

Neumi5694

Top Contributor
Ich bin noch neu im Programmieren, was bedeutet 77:73 ?
Der Sinn der "fancy if" ist, dass counter = 73, falls das Jahr 1582 ist. Ansonsten 77

Falls die Bedingung true ist, so wird der Ausdruck nach dem Fragezeichen ausgewertet und zurückgegeben, ansonsten der nach dem Doppelpunkt.
Funktioniert tadellos, Der Nachvollziehbarkeit halber - um es später besser warten zu können - würde ich etwas mehr Text opfern. In Java 17 kann man hier sehr schön so was wie den Rule-Switch verwenden.
Achtung: Das ist rein eine persönliche Vorgehensweise und beeinflusst in keiner Weise das Ergebnis.
Java:
  counter = switch (year) {
        case 1982 -> 73; //und hier noch sagen, wozu das Ganze.
        default -> 77;
  };

ps: Verwende bitte Code-Tags. ("</>" Symbol)
Dein Code ist unnötig schwer zu lesen und Arrays werden eventuell falsch dargestellt.
 

sserio

Bekanntes Mitglied
Der Sinn der "fancy if" ist, dass counter = 73, falls das Jahr 1582 ist. Ansonsten 77

Falls die Bedingung true ist, so wird der Ausdruck nach dem Fragezeichen ausgewertet und zurückgegeben, ansonsten der nach dem Doppelpunkt.
Funktioniert tadellos, Der Nachvollziehbarkeit halber - um es später besser warten zu können - würde ich etwas mehr Text opfern. In Java 17 kann man hier sehr schön so was wie den Rule-Switch verwenden.
Achtung: Das ist rein eine persönliche Vorgehensweise und beeinflusst in keiner Weise das Ergebnis.
Java:
  counter = switch (year) {
        case 1982 -> 73; //und hier noch sagen, wozu das Ganze.
        default -> 77;
  };

ps: Verwende bitte Code-Tags. ("</>" Symbol)
Dein Code ist unnötig schwer zu lesen und Arrays werden eventuell falsch dargestellt.
Das kommt mir logisch vor. Danke erstmal. Woher kommt dann eigentlich die Zahl 73, die der eine User hier gepostet hat. 77 ist logisch, weil der Abstand vom12.10.1582 bist 1583 77 Tage sind. Ich erhöhe dann in der for schleife das Start Jahr des gregorianischen Kalenders aber auf 83 weswegen ich die 77 doch so oder so addieren muss. Wieso dann die 73 oder diese fancy schreibweise der if bedingung,wenn ich es doch auch einfach +77 rechenen kann .In jedem Fall ist es ja 1583
 

Neumi5694

Top Contributor
Warum 73 weiß ich auch nicht, hab mich mit dem Kalender nicht beschäftigt. Falls es diese Zahl aber für das Jahr 1582 braucht, weil damals gemurkst wurde, dann kannst du sie so einbinden.

Der Gregorianische Kalender hat ja auch eine gewisse Evolution hinter sich, die erste Version funktionierte noch nicht zufriedenstellend. Tatsächlich hat Papst Gregor die "fertige" Version gar nicht mehr miterlebt. Es kann also durchaus zu Abweichungen gekommen sein.
Außerdem wurde er auch nicht weltweit gleichzeitig übernommen. Anfang des 20. Jahrhunderts hatten z.B. die Russland und Europa einen Unterschied von 11 oder 12 Tagen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
F MS365 Kalender lesen Java Basics - Anfänger-Themen 5
T simpler Kalender Java Basics - Anfänger-Themen 10
G Kalender Jahreszahlen Java Basics - Anfänger-Themen 6
A Kalender programmieren, ich finde meinen Fehler nicht. Java Basics - Anfänger-Themen 9
J Gerorianischer Kalender wechselt am Freitag die Woche Warum Java Basics - Anfänger-Themen 2
N Kalender - Tag addieren gibt 31. Juni zurück Java Basics - Anfänger-Themen 3
S Hinweis zu Fehler im Kalender-Code - Aufgabe 5.3 aus Grundkurs Programmieren in Java 7. Auflage Java Basics - Anfänger-Themen 4
I c++ sexagesimal kalender Java Basics - Anfänger-Themen 5
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
U Neu Julianischer Kalender Java Basics - Anfänger-Themen 2
T Kalender irrt sich Java Basics - Anfänger-Themen 8
M Kalender reloaded Java Basics - Anfänger-Themen 7
L Kalender Java Frame Java Basics - Anfänger-Themen 7
M Kalender mit Terminen Java Basics - Anfänger-Themen 24
F Problem mit selbstprogrammierten Kalender (als Übung) Java Basics - Anfänger-Themen 4
J Arrays (Kalender) Fehler im Programm Java Basics - Anfänger-Themen 2
P Date oder Kalender? Was soll man verwenden? Java Basics - Anfänger-Themen 2
K Erste Schritte Kalender selber erstellen? Java Basics - Anfänger-Themen 3
A JKomponente für Kalender Java Basics - Anfänger-Themen 5
R Kalender speichert keine Zeit Java Basics - Anfänger-Themen 2
L einfachen kalender Programmieren HA! Java Basics - Anfänger-Themen 76
M Kalender Java Basics - Anfänger-Themen 15
E Methoden zusammenfassen/Kalender erstellen Java Basics - Anfänger-Themen 13
T Einfacher Kalender Java Basics - Anfänger-Themen 17
G Kalender Bean in Netbean einbinden Java Basics - Anfänger-Themen 3
F Termine in einen kalender eintragen. Java Basics - Anfänger-Themen 11
G Kalender Von String zu boolean -- NullpointerException Java Basics - Anfänger-Themen 2
S Wie Termine/Notizen in Outlook Kalender einfügen ? Java Basics - Anfänger-Themen 3
D Gibt es einen vordefinierten Kalender in java? Java Basics - Anfänger-Themen 8
H Java Kalender systemabhängig programmieren? Java Basics - Anfänger-Themen 3
B Kalender -> Termine eintragen Java Basics - Anfänger-Themen 1
W Java Kalender Java Basics - Anfänger-Themen 6
B Kalender und Wochentagswechsel Java Basics - Anfänger-Themen 6
G The serializable class Kalender does not declare a static fi Java Basics - Anfänger-Themen 5
A Kalender mit Objekten belegen Java Basics - Anfänger-Themen 3
A kalender Java Basics - Anfänger-Themen 26
J Wie drucke ich eine Komponente wie Kalender auf dem Drucker Java Basics - Anfänger-Themen 3
G Kalender ? Java Basics - Anfänger-Themen 6
S kalender machen Java Basics - Anfänger-Themen 40
G kalender Java Basics - Anfänger-Themen 15
P Kalender Programmieren Java Basics - Anfänger-Themen 2
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
R Interface Datentyp bei Erzeugung eines Objekts, dessen Klasse eine Schnittstelle implementiert Java Basics - Anfänger-Themen 18
L von einem file dessen pfad ermitteln? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben