Java Zeitabstand zwischen 2 Daten ohne importierte Funktionen!

Zooza

Cadet 3rd Year
Registriert
Sep. 2013
Beiträge
41
Hi, ich habe vor kurzem angefangen Wirtschaftsinformatik zu studieren und muss die ersten Programme für die Uni schreiben, ich habe gar keine Programmiererfahrung und unser Dozent setzt leider sehr viel Wissen vorraus. Wir sollen ein Programm im Java schreiben, welches 2 Daten vergleicht (Nur Daten bei denen die Regel gilt, wenn durch 4 teilbar = Schaltjahr).

Ich habe mir deswegen mein Anfängerwissen zusammengegoogelt und mit einem Freund getüftelt. Inzwischen bin ich auf Folgenden Code gekommen:

Code:
import java.util.Scanner;
public class Tage {
 
    public static void main(String[] args) {
    
        int tag1, tag2, monat1, monat2, jahr1, jahr2, i, a, z. copy;
        Scanner scan = new Scanner(System.in);
    
        System.out.println("Geben Sie das erste Datum ein:");
        tag1 = scan.nextInt();
        monat1 = scan.nextInt();
        jahr1 = scan.nextInt();
    
        System.out.println("Geben Sie das zweite Datum ein:");
        tag2 = scan.nextInt();
        monat2 = scan.nextInt();
        jahr2 = scan.nextInt();
        copy = jahr2;
    
        i = jahr2-jahr1;
        z = 0;
        while (i > 0) {
            a = jahr2 % 4;
        
            if (a !=0) {
                z = z+365;            
            } else { 
                z = z+366;
            }             
                                         
        i = i-1;
        jahr2 = jahr2-1;
        } //while                                                  
                  
        i = monat2;
        if (i == 12) {
            z = z+365;
        }else if (i == 11) {
            z = z+334;
        }else if (i == 10) {
            z = z+304;
        }else if (i == 9) {
            z = z+31+28+31+30+31+30+31+31+30;
        }else if (i == 8) {
            z = z+31+28+31+30+31+30+31+31;
        }else if (i == 7) {
            z = z+31+28+31+30+31+30+31;
        }else if (i == 6) {
            z = z+31+28+31+30+31+30;
        }else if (i == 5) {
            z = z+31+28+31+30+31;
        }else if (i == 4) {
            z = z+31+28+31+30;
        }else if (i == 3) {
            z = z+31+28+31;
        }else if (i == 2) {
            z = z+31+28;
        }else if (i == 1) {
            z = z+31;
        }
                  
        if ( monat2 > 2 && copy%4 == 0) {
            z = z+1;
        }
        
        i = monat1;
        if (i == 12) {
            z = z-365;
        }else if (i == 11) {
            z = z-334;
        }else if (i == 10) {
            z = z-304;
        }else if (i == 9) {
            z = z-(31+28+31+30+31+30+31+31+30);
        }else if (i == 8) {
            z = z-(31+28+31+30+31+30+31+31);
        }else if (i == 7) {
            z = z-(31+28+31+30+31+30+31);
        }else if (i == 6) {
            z = z-(31+28+31+30+31+30);
        }else if (i == 5) {
            z = z-(31+28+31+30+31);
        }else if (i == 4) {
            z = z-(31+28+31+30);
        }else if (i == 3) {
            z = z-(31+28+31);
        }else if (i == 2) {
            z = z-(31+28);
        }else if (i == 1) {
            z = z-31;
        }
        
        if ( monat1 > 2 && jahr1%4 == 0) {
            z = z-1;
        }
                
        i = tag2 - tag1;
        z = z+i;  

        System.out.println("Tage: " +z);    
                 
    } //public
} //class

Ich weiß das dieser Code wahrscheinlich extrem umständlich ist und man das Problem bestimmt viel einfacher lösen könnte, aber durch meine mangelnden Erfahrungen in Sachen Programmieren ist das das beste, was mir eingefallen ist.

Dadrinnen befinden sich definitv Denkfehler, denn das Ergebnis weicht immer ein paar Tage vom tatsächlichen Ergebnis ab, kann mir jemand helfen?

Ps.: Uns ist leider nicht erlaubt iwelche Kalender-Funktionen oder ähnliches zu importieren. Unser Dozent meinte er kann die Berechnung in der Musterlösung in nur 6 Zeilen Code tätigen... für mich nicht nachvollziebahr.

Danke!!!
 
http://www.geom.uiuc.edu/~daeron/docs/apidocs/java.util.Date.html
http://www.mkyong.com/java/how-to-compare-dates-in-java/

Ich würde es folgendermaßen lösen:
Erstmal alle 3 Paramter abfragen also Tag, Monat und das Jahr. Nach korrekter Eingabe ein Date Objekt erzeugen und mittels Date.equals(), Date.before() und Date.after() vergleichen. Das ist wesentlich eleganter und sinnvoller als dieses Konstrukt eines If-Holocausts.

Edith:
Wenn dieses Date Objekt nicht erlaubt ist, würde ich mir eine eigene Klasse erzeugen, oder zumindest in der einfachsten Lösung ein Array mit 3 Elementen für Tag, Monat, Jahr und dieses erzeugen lassen. Am Ende beide Daten in Integer parsen lassen über
Code:
Integer.parseInt()
. Danach stupide vergleichen und das Resultat ausgeben.
 
Zuletzt bearbeitet:
Ich sehe den Fehler auch nicht auf Anhieb.
Erstmal würde ich versuchen, den Code etwas lesbarer zu machen. Benutze dazu eine Lookup Table, und zwar folgendermaßen (das "..." natürlich noch ausfüllen):
Code:
int months[] = { 31, 28, 31, 30, ... };
Dann kannst du die 12 If-Abfragen durch ein einfaches:
Code:
for(int index = 0; index < i; index++) {
  z += months[index];
}
bzw. (der zweite Block mit if-Abfragen)
Code:
for(int index = 0; index < i; index++) {
  z -= months[index];
}
ersetzten. (Die Abfragen nach Schaltjahren musst du natürlich beibehalten)

Ich hoffe, das hilft dir weiter. Denn durch einem kompakteren Code findet man auch meist den Fehler besser.

P.S. In Zeile 62 und 93: Warum "monat2 > 2" und nicht "monat2 >= 2"?
Ach nee, das war richtig so.
 
Zuletzt bearbeitet:
Die Definition vom Schaltjahr ist übrigens nicht ganz vollständig.
- Ein Schaltjahr ist durch 4 teilbar.
- Es darf aber nicht durch 100 teilbar sein (Jahr 2100 ist kein Schaltjahr) , jedoch mit einer Ausnahme, das ein durch 400 teilbares Jahr auch ein Schaltjahr ist (Jahr 2000 war ein Schaltjahr).
 
Zurück
Oben