Java - wievielter Tag im Jahr berechnen?
Hallo, ich habe folgende Aufgabenstellung: Schreiben Sie ein Programm, das für ein gegebenes Datum bestehend aus Tag, Monat und Jahr ausrechnet, um den wievielten Tag im Jahr es sich handelt. (Achtung: Schaltjahrproblematik nicht vergessen.)
Mein Code:
import java.util.Scanner;
public class TagImJahr
{
public static void main(String[] args)
{
Scanner read = new Scanner(System.in);
int tag, monat, jahr, anzahlTage, wievielterTag, monatTag;
boolean Schaltjahr;
System.out.println("Geben Sie einen Tag ein: ");
tag = read.nextInt();
System.out.println("Geben Sie einen Monat ein: ");
monat = read.nextInt();
System.out.println("Geben Sie ein Jahr ein: ");
jahr = read.nextInt();
Schaltjahr = (jahr%4 == 0) && (jahr%100 != 0) || (jahr%400 == 0);
if(Schaltjahr && monat == 2)
{
anzahlTage = 366; //Anzahl der Tage im Jahr
monatTag = 29; //Tage im Monat
}
else
{
anzahlTage = 365; //Anzahl der Tage im Jahr
monatTag = 31; //Tage im Monat
}
int datum = anzahlTage + (monat * monatTag - monatTag) + tag;
wievielterTag = datum - anzahlTage;
System.out.println("Der " + tag + "." + monat + "." + jahr + " ist der " + wievielterTag + ". Tag im Jahr");
}
}
Jedoch fehlt bei mir irgendwas, evtl. das manche Monate 31 und 30 Tage haben, wie baue ich dies jedoch am Besten ein? Bei ein paar Datumseingaben kommt das richtige Ergebnis, bei anderen weichen die Tage um paar Zahlen ab.
Kann mir bitte jemand weiterhelfen?
2 Antworten
In der Praxis würde man wahrscheinlich eine Hashtabelle nutzen, die jedem Monat die Anzahl an Tagen zuordnet.
Mach also ein Array mit den Elementen 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
Dann durchläufst du das das Array in einer Schleife. Ungefähr so:
for(i=0;i<monat-1;i++){
anzahlTage += arrMonatstage[i];
}
anzahlTage += tag;
Ob es sich um ein Schaltjahr handelt, weißt du bereits. Du könntest dir diesen Status in eine boolschen Variable merken.
Dann brauchst du nur noch den eventualen Schalttag addieren.
if(bSchaltjahr)
if(monat > 2)
anzahlTage++;
Hinweis:
Ein Array kannst du wie folgt direkt vorbelegen:
int[] arrMonatstage = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
j Jahr
sj 1 wenn Schaltjahr, sonst 0
m Monat
t Tag im Monat
n Tag im Jahr
d Anpassung an Kalenderjahr (Februar ist unregelmäßig)
Das Prinzip für Tag im Jahr:
Hin: n=int(m*(30,5+1/c)-(Offset+d))+t
n=int(m*275/9)-30-int((m+9)/12)*(2-sj)+t