Java Wochentag berechnen... kurze Hilfe bitte!

Niv k

Mitglied
Hallo Leute!...

Habe in Java einen Wochentagberechner geschrieben...
Nur er funktioniert einfach nicht und nach meheren Stunden Fehlersuche, zum Teil zusammen
mit meinem Arbeitskollegen (auch Azubi) ist mir echt Wirr und ich denke hier sind sicher welche die schnell sehen, was da schief läuft...
Hie mein Code:

Java:
import java.util.Scanner;


public class WochentagAusgeben {


	public static void main(String[] args) {

	  int ReferenzJahr = 1584;                                   			
	  Scanner sc = new Scanner(System.in);                       			
	
	  System.out.println("Geben Sie das gesuchte Jahr ein:");    			
	  int GesuchtesJahr = sc.nextInt();									    
      System.out.println("Geben Sie den gesuchten Monat als Zahl ein:");	
	  int GesuchterMonat = sc.nextInt();									
	  System.out.println("Geben Sie den gesuchten Tag ein:");				
	  int GesuchterTag = sc.nextInt();									    
	  int VergangeneTage = 0;												
      boolean Schaltjahr = false;											
 	  
	  while (ReferenzJahr <= GesuchtesJahr) {								
		
        if (ReferenzJahr % 4 == 0) {                                                 									 						        					                                                
          Schaltjahr = true;
		} 	    
		
        if (ReferenzJahr % 100 == 0) {
          Schaltjahr = false;
        }
		
        if (ReferenzJahr % 400 == 0) {
          Schaltjahr = true;
        }       
                
        if (Schaltjahr == true) {											
        	VergangeneTage = VergangeneTage + 366;							
		} else {
			VergangeneTage = VergangeneTage + 365;
		}
		
		ReferenzJahr++;	    												
	  }
	  
	  int Februar = 28;										
	  
	  if (Schaltjahr == true) {								
		 Februar = 29;										
		 VergangeneTage = VergangeneTage - 366;				
	  } else {
	     VergangeneTage = VergangeneTage - 365;				
	  }

	  
	  switch (GesuchterMonat) {								
	  														
	  case 1:												
        VergangeneTage = VergangeneTage + 0;
        break;       
	  case 2:
	    VergangeneTage = VergangeneTage + 31;
	    break;	        
	  case 3:
	    VergangeneTage = VergangeneTage + 31 + Februar;
	    break;	        
	  case 4:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31;
	    break;	        
	  case 5:																								
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30;
	    break;	        
	  case 6:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31;
	    break;	        
	  case 7:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30;
	    break;	        
	  case 8:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31;
	    break;	        
	  case 9:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31;
	    break;	        
	  case 10:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30;
	    break;	        
	  case 11:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31;
	    break;	        
	  case 12:
	    VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31 + 30;
	    break;
	  default: 
		System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?");
		break;
	  }	  
	  
	  int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7;						
	  																		    
	  switch (Wochentag) {
	  
	  case 0:
		System.out.println("Der gesuchte Tag ist ein Sonntag!");			 
		break;
	  case 1:
		System.out.println("Der gesuchte Tag ist ein Montag!");			   
		break;
	  case 2:
		System.out.println("Der gesuchte Tag ist ein Dienstag!");			    
		break;
	  case 3:
		System.out.println("Der gesuchte Tag ist ein Mittwoch!");			  
		break;		 
	  case 4:
		System.out.println("Der gesuchte Tag ist ein Donnerstag!");			
		break;
	  case 5:
		System.out.println("Der gesuchte Tag ist ein Freitag!");		    	
		break;
	  case 6:
		System.out.println("Der gesuchte Tag ist ein Samstag!");		    	
		break;
	  default: 
		System.out.println("Offenbar gab es einen Fehler bei der Berechnung!");
		break;
	  }
	  
	}
}

Sorry, wenn nicht sofort klar ist, was was ist, hatte eig. alles kommentiert, leider führt das hier zu totaler unleserlichkeit aufgrund der Zeilenumbrüche :/
Hoffe ihr könnt iwie helfen...

Danke!
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

sehr hilfreich wäre vor dem Fehlersuchen das eigentliche Problem.
Falsches Ergebnis (was statt was), Exception (welche), ...?
Hast du mal mit dem Debugger eingegrenzt, wo was passiert?

Ich hab mal die Codetags auf die Sprache angepasst.
 
Danke, freue mich hier zu sein!

Stimmt, hätte echt mehr sagen müssen, sorry,
Also: Das Ergebnis stimmt einfach nicht. Meist liegt es so +- 2 Tage daneben.
Habe im debuger mal nachgesehen, was so passiert. Immerhin stimmt es, das bei 2012 Schaltjahr true ist. Ich denke das ich irgendwie was mit den Tagen falsch habe.

Als Referenzjahr bzw. Tag ist Sonntag der 1. Januar 1584 genannt. Dann lasse ich in der schleife immer wieder abfragen, ob das momentane jahr ein schaltjahr ist, wenn ja kommen 366 Tage dazu wenn nicht 365. Nach der schleife ziehe ich wiede rje nach Schaltjahr 366 bzw. 365 ab, weil in der schleife auch das geforderte Jahr dazugerechnet wurde, das tue ich deshalb, weil ich ja auch vom aktuellem Schaltjahr wissen will, ob es einschaltjahr ist.
Dadurch wird dann ja auch Februar entsprechend auf 29 oder 28 Tage gesetzt. Danach werden die vergangenen Tage der Monate addiert und die Tage, die eingegeben wurden ( -1 weil der eingegebene tag selbst ja noch nicht vergangen ist).
Die summe des ganzen also der vergangenen Tage dann %7 ... ist es 0 muss es wieder ein Sonntag sein, 1 ein montag etc...

Soweit die Theorie, leider ist irgendwo ein ganz blöder Fehler drinne.
Z.B.: der 11.02.1964 muss ein Dienstag werden. Es kommt Montag raus.
Der 01.01.2012 ist angeblich ein Freitag!

Hoffe die Informationen helfen besser!
Danke.
 
Konnte zwar ein Problem finden, war aber anscheinend nicht alles, geht noch immer nicht.
(In der while-Jahr<=-Schleife muss Schaltjahr wieder auf false gesetzt werden.)

Alternative: Warum nicht die Wochentagsformel von Gauß?
 
Hi.

Ich habe es spaßeshalber mal etwas vereinfacht. Scheint zu funktionieren:
Java:
import java.util.Scanner;


public class Weekday {

    private static boolean istTeilbar(int x, int teiler) {
        return (x % teiler == 0);
    }

    private static boolean istSchaltjahr(int jahr) {
        return (istTeilbar(jahr, 400) ||
                istTeilbar(jahr, 4) && ! istTeilbar(jahr, 100));
    }

    public static void main(String[] args) {

        int ReferenzJahr = 1584; // Beginn gregorianischer Kalender. 1. 1. 1584 war ein Sonntag.
        Scanner sc = new Scanner(System.in);

        System.out.println("Geben Sie das gesuchte Jahr ein:");
        int GesuchtesJahr = sc.nextInt();
        System.out.println("Geben Sie den gesuchten Monat als Zahl ein:");
        int GesuchterMonat = sc.nextInt();
        System.out.println("Geben Sie den gesuchten Tag ein:");
        int GesuchterTag = sc.nextInt();
        int VergangeneTage = 0;
        boolean Schaltjahr = false;

        while (ReferenzJahr < GesuchtesJahr) {
            Schaltjahr = istSchaltjahr(ReferenzJahr);

            if (Schaltjahr) {
                VergangeneTage = VergangeneTage + 366;
            } else {
                VergangeneTage = VergangeneTage + 365;
            }

            ReferenzJahr++;
        }

        int Februar = istSchaltjahr(GesuchtesJahr) ? 29 : 28;

        switch (GesuchterMonat) {
        case 12:
            VergangeneTage += 30;
        case 11:
            VergangeneTage += 31;
        case 10:
            VergangeneTage += 30;
        case 9:
            VergangeneTage += 31;
        case 8:
            VergangeneTage += 31;
        case 7:
            VergangeneTage += 30;
        case 6:
            VergangeneTage += 31;
        case 5:
            VergangeneTage += 30;
        case 4:
            VergangeneTage += 31;
        case 3:
            VergangeneTage += Februar;
        case 2:
            VergangeneTage += 31;
        case 1:
            break;
        default:
            System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?");
        }

        int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7;

        String wochentag[] = {
            "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"
        };

        System.out.printf("Der gesuchte Tag ist ein %s!\n", wochentag[Wochentag]);
    }
}
PS: Übrigens schreibt man in Java nur Klassennamen groß. Variablennamen sollten in mixed Case mit Kleinbuchstaben anfangen - siehe z.B. http://java.about.com/od/javasyntax/a/nameconventions.htm

Gruß
 
Zuletzt bearbeitet:
Hallo alle zusammen!

Erst einmal danke für die schnelle und kompetente Hilfe!
Hätte nicht gedacht, dass so schnell Leute antworten... und vor allem:
Das man hier nicht wie in diversen anderen Foren direkt "fertig" gemacht wird, wenn man mal einen einfachheren Fehler nicht findet!

Das Problem schein jetzt gelöst zu sein! Es war scheinbar wirklich nur die while schleife in der bei jedem Durchgang, das Schaltjahr wieder auf false gesetzt werden muss!
Denn nun kommen die richtigen Tage raus, an den Daten, an denen sonst immer das Flasche raus kam!

Die anderen Lösungen haben mir zusätzlich auch noch weitere unbekannte Lösungswege gezeigt.
Leider konnte ich keine der anderen Formeln benutzen, da es sich um eine fest definierte Schulaufgabe handelte, bei der genau diese benutzt werden sollte...
Ich danke euch allen nochmal!

Und zu den großen Variabelennamen: Ich versuch mich zu bessern! Ich komme aus einem Betrieb der eig. nur mit C++ und Javascript arbeitet und bei uns ist es Sitte die Variabelen groß zu schreibne, dass habe ich mir inzwischen schon angewöhnt. Aber ich hoffe auf besserung!

In diesem Sinne! Danke und bis zur nächsten Herausforderung!
 
Zur Vereinfachung und Kontrolle der Daten habe ich ein einfaches Java Programm entwickelt, welches anhang des gesetzten Datums den Wochentag liefert.

Code:
import java.text.DateFormat;
import java.util.Calendar;

public class WochentagBeispiel {

	public static int getDay(int y, int m, int d) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, y);
		cal.set(Calendar.MONTH, m);
		cal.set(Calendar.DATE, d);
		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
		// Die folgende Ausgabe dient nur zur Validierung
		System.out.println(df.format(cal.getTime()));
		return cal.get(Calendar.DAY_OF_WEEK);
	}
	
	public static void main(String[] args) {
		// Achtung Monate beginnen mit 0 (zero based) d.h. Jan = 0, Feb = 1 etc.
		System.out.println("Tag der Woche (1 = Sonntag, 7 = Samstag) von 4.11.2009: " + getDay(2009, 10, 4) );
	}
}
 
Zuletzt bearbeitet:
Zurück