# Wochentag eines Datums berechnen



## Alsou (6. Jul 2010)

Hallo, ich hätte da eine Frage und zwar wieso man da keine case-Anweisung für den Monat Januar braucht. Vielen Dank



```
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int tag=23;
		int monat=1;
		int jahr=1949;
		
		int wochentag=(jahr-1900)*365 + (jahr-1900)/4;
		
		if (jahr %4==0 && monat<=2){
			wochentag--;	
		}

		
		switch (monat){
		case 12: wochentag+=30;
		case 11: wochentag+=31;
		case 10: wochentag+=30;
		case 9: wochentag+=31;
		case 8: wochentag+=31;
		case 7: wochentag+=30;
		case 6: wochentag+=31;
		case 5: wochentag+=30;
		case 4: wochentag+=31;
		case 3: wochentag+=28;
		case 2: wochentag+=31;
		}
		
		wochentag=(tag+wochentag)%7;
		
		switch (wochentag){
		case 0: System.out.println("Sonntag");
		break;
		case 1: System.out.println("Montag");
		break;
		case 2: System.out.println("Dienstag");
		break;
		case 3: System.out.println("Mittwoch");
		break;
		
		case 4: System.out.println("Donnerstag");
		break;
		
		case 5: System.out.println("Freitag");
		break;
		
		case 6: System.out.println("Samstag");
		break;
		
		}
		
		
	}

}
```


----------



## eRaaaa (6. Jul 2010)

Naja Januar ist der erste Monat...macht doch da keinen Sinn 31 Tage oder sonst wie drauf zu addieren...Hast du dir mal angeschaut was das switch macht bei z.B. dem Monat 12? Welche Fälle werden da durchlaufen? ..mal drüber nachdenken...


----------



## Alsou (6. Jul 2010)

soweit ich weiß sind die case-anweisungen Einsprungsmarken zu denen gesprungen wird, wenn der Ausdruck den entsprechenden Wert annimmt. Da gibst aber keine case 1... Woher weiß der Compiler welche case-anweisung er ausführen soll...


----------



## Gast2 (6. Jul 2010)

switch kannst du dir als ein if-elseif kontruktr vorstellen.
und wenn er kein passendes case findet dann wird auch nichts ausgeführt


----------



## eRaaaa (6. Jul 2010)

Naja in dem Fall hat switch aber Durchfall(by Christan U. ), d.h. bei case 12 werden auch alle anderen durchlaufen(was ja auch gerade der Sinn hier ist). 

Mal etwas anders:

Wenn du den 1. Februar hast, wie viele Tage sind dann bereits im Jahr vergangen? (siehe case2!)
(vllt wirds bei case 3 (März bzw. Februar=28 Tage klar!)
Wenn du den 1. Januar hast, wie viele Tage sind dann vergangen(und wie viele musst du also drauf addieren?)


----------



## Alsou (6. Jul 2010)

ok, das mit januar habe ich verstanden vielen vielen dank. Aber wieso werden alle case 12 durchlaufen??


----------



## Gast2 (6. Jul 2010)

Weil nirgends nen 
	
	
	
	





```
break;
```
 steht


----------



## Landei (7. Jul 2010)

Da war wohl jemand in switch-Statements verliebt. Ich finde diese Version viel klarer und lesbarer:

```
public class WeekDay {

    public static final int[] tageImMonat = {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public static final String[] tagNamen = {
        "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

    public static void main(String[] args) {
        System.out.println(wochenTag(23, 1, 1949));
    }

    public static String wochenTag(int tag, int monat, int jahr) {

        int wochentag = (jahr - 1900) * 365 + (jahr - 1900) / 4;

        if (jahr % 4 == 0 && monat <= 2) {
            wochentag--;
        }

        for(int i = 0; i < monat - 1; i++) {
            wochentag += tageImMonat[i];
        }

        wochentag = (tag + wochentag) % 7;

        return tagNamen[wochentag];
    }
}
```


----------

