Tag Monat Jahr korrekt berrechnen!

Marc T.

Bekanntes Mitglied
Halli Hallo,

ich hab hier mal was programmiert (ich weiß das gibt es fertig, war nur zum Spaß ;)),
und jetzt ist iwo nen klitze-kleiner Fehler drin aber er will von mir derzeit nicht
gefunden werden.... ist bestimmt iwas ganz leichtes offensichtliches aber ich steh seid
ein paar Stunden auf dem Schlauch ;)

Ich habe hier erst einmal so meine Millisekunden, Sekunden, Minuten, Stunden und Tage
berrechnet:

Java:
time = System.currentTimeMillis();
long temp = time;
		
this.setMilliSecond((int)(temp % 1000));
temp /= 1000;
this.setSecond((int)(temp % 60));
temp /= 60;
this.setMinute((int)(temp % 60));
temp /= 60;
this.setHour((int)(temp % 24));
temp /= 24;
		
setYearMonthDay((int)temp);

Und dann wollte ich mit setYearMonthDay((int)temp); meine
restlichen Daten ermitteln (tage, monate, jahre)

Die setYearMonthDay Methode sieht wie folgt aus:

Java:
private void setYearMonthDay(int days) {
	int tempYear = 1970;
	int tempMonth = JANUARY;
	int tempDay = 1;
	int allDays = days;
	System.out.println(allDays);
		
	for(int i = 0; i < allDays; i++) {
			
		tempDay++;
			
		if(tempDay > getDaysOfMonth(tempMonth)) {
			tempMonth++;
			tempDay = 1;
		}
			
		if(tempMonth > MAXMONTHSOFYEAR) {
			tempYear++;
			tempMonth = 1;
		}
	}
		
	this.setYear(tempYear);
	this.setMonth(tempMonth);
	this.setDay(tempDay);
}

Die Konstante JANUARY ist natürlich 1. Das Datum im allgemeinen meines Wissens
nach der Tag, seit dem die Millisekunden gezählt werden (?!).
MAXMONTHSOFYEAR ist natürlich 12.
(btw. fällt jemanden hierzu ein besseren Methoden-Namen ein? ;))

Die Methode getDaysOfMonth() sieht so aus:

Java:
public int getDaysOfMonth(int month) {
	if(month == JANUARY) {
		return 31;
	} else if(month == FEBRUARY) {
		if(isLeapYear(year)) {
			return 29;
		} else {
			return 28;
		}
	} else if(month == MARCH) {
		return 31;
	} else if(month == APRIL) {
		return 30;
	} else if(month == MAY) {
		return 31;
	} else if(month == JUNE) {
		return 30;
	} else if(month == JULY) {
		return 31;
	} else if(month == AUGUST) {
		return 31;
	} else if(month == SEPTEMBER) {
		return 30;
	} else if(month == OCTOBER) {
		return 31;
	} else if(month == NOVEMBER) {
		return 30;
	} else if(month == DECEMBER) {
		return 31;
	} else {
		return -1;
	}
}

Die Konstanten brauche ich denke ich nicht weiter erläutern ;)

Und zu guter letzt die isLeapYear():

Java:
public boolean isLeapYear(int year) {
	if(year%4 == 0) {
		if(year%100 == 0) {
			if(year%400 == 0) {
				return true;
			} else {
				return false;
			}
		}
		return true;
	}
	return false;
}

Für das heutige Datum müsste demnach ja 20.03.2012 rauskommen.
Es kommt allerdings der 17.01.2012 raus, also stimmt da iwo was nicht
aber ich komm einfach nicht drauf.

Hat jemand eventuell einen Tipp für mich? ;)
 
S

SlaterB

Gast
> tempMonth = 1;
im Code ist nicht sehr professionell, wenn schon Konstanten angelegt sind,

diese Konstanten und sonstige fehlende Methoden NICHT zu posten ist übrigens ziemlich gemein,
wie soll man das testen, nur durch Anschauen auf die Lösung kommen? ;)

der Fehler ist anscheinend
> if(isLeapYear(year))
in getDaysOfMonth(), was ist dort year? wohl nicht tempYear aus der Schleife, sondern mutmaßlich das aktuelle Jahr 2012,
dann ist jedes Jahr Schaltjahr, das passt zu den fehlenden Tagen, denke ich

solche Sachen sind doch ideale Testfälle, schade dass du darauf verzichtest,
fange mit 1.1.1970 an, funktioniert das? danach 1 Tag, 5 Tage, 25 Tage, 35 Tage usw. nach vorne springen wo tritt erstmals ein Fehler auf,
im Detail anschauen welche Monatswerte usw. zusammenaddiert werden


-1 bei unbekannten Monat solltest du nicht zurückgeben, so kann ein weiterer möglicher Fehler unerkannt bleiben,
wirf eine Exception!

@AlexSpritze
die Calendar-Implementierung von Java wird oftmals aber gerade nicht als natürlich angesehen ;)

Java:
public class Test
{

    public static void main(String[] args)
    {
        new Test();
    }

    public Test()
    {
       long time = System.currentTimeMillis();
        long temp = time;

//        this.setMilliSecond((int)(temp % 1000));
        temp /= 1000;
//        this.setSecond((int)(temp % 60));
        temp /= 60;
//        this.setMinute((int)(temp % 60));
        temp /= 60;
//        this.setHour((int)(temp % 24));
        temp /= 24;

        setYearMonthDay((int)temp);
    }

    private void setYearMonthDay(int days)
    {
        int tempYear = 1970;
        int tempMonth = 1;
        int tempDay = 1;
        int allDays = days;
        System.out.println(allDays);

        for (int i = 0; i < allDays; i++)
        {

            tempDay++;

            if (tempDay > getDaysOfMonth(tempMonth,tempYear))
            {
                tempMonth++;
                tempDay = 1;
            }

            if (tempMonth > 12)
            {
                tempYear++;
                tempMonth = 1;
            }
        }
        System.out.println(tempDay+"."+tempMonth+"."+tempYear);
    }

    public int getDaysOfMonth(int month, int year)
    {
        if (month == 1)
        {
            return 31;
        }
        else if (month == 2)
        {
            if (isLeapYear(year))
            {
                return 29;
            }
            else
            {
                return 28;
            }
        }
        else if (month == 3)
        {
            return 31;
        }
        else if (month == 4)
        {
            return 30;
        }
        else if (month == 5)
        {
            return 31;
        }
        else if (month == 6)
        {
            return 30;
        }
        else if (month == 7)
        {
            return 31;
        }
        else if (month == 8)
        {
            return 31;
        }
        else if (month == 9)
        {
            return 30;
        }
        else if (month == 10)
        {
            return 31;
        }
        else if (month == 11)
        {
            return 30;
        }
        else if (month == 12)
        {
            return 31;
        }
        else
        {
            throw new RuntimeException();
        }
    }


    public boolean isLeapYear(int year)
    {
        if (year % 4 == 0)
        {
            if (year % 100 == 0)
            {
                if (year % 400 == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Crian

Top Contributor
Ich hab auch eine eigene Datumsklasse geschrieben, weil mir die vorhandenen Geschmacksrichtungen nicht gefielen. Das ist nichts verwerfliches. Allerdings gehört zu meiner ein ausführlicher Unit-Test. Das finde ich sehr praktisch und gibt ein sichereres Gefühl als nur ein paar händische Tests absolviert zu haben.

Das würde ich dir auch empfehlen, solange das ganze nicht nur eine Fingerübung werden soll.
 

Marc T.

Bekanntes Mitglied
Ich bin ganz ehrlich, habe noch nie einen Unit-Test gemacht und war bisher immer
zu faul mich in ein neues Tool einzuarbeiten aber ihr habt natürlich Recht, das sollte
ich jetzt wirklich mal tun.

@SlaterB
Danke dir, natürlich wie ichs mir gedacht habe nen ganz einfacher Fehler.

Java:
private void setYearMonthDay(int days) {
    int tempYear = 1970;
    int tempMonth = JANUARY;
    int tempDay = 1;
    int allDays = days;
    System.out.println(allDays);
        
     this.setYear(tempYear);     // Einfach nur das hier rein ;)

    for(int i = 0; i < allDays; i++) {
            
        tempDay++;
            
        if(tempDay > getDaysOfMonth(tempMonth)) {
            tempMonth++;
            tempDay = 1;
        }
            
        if(tempMonth > MAXMONTHSOFYEAR) {
            tempYear++;
            this.setYear(tempYear);     // Einfach nur das hier rein ;)
            tempMonth = 1;
        }
    }
        
    this.setYear(tempYear);
    this.setMonth(tempMonth);
    this.setDay(tempDay);
}
 
Zuletzt bearbeitet:

Marc T.

Bekanntes Mitglied
Meine Meinung dazu ist, dass es ganz aufs Anwendungsgebiet ankommt.
Wenn man nur für sich privat das macht ist das doch Okay, allerdings
ist es unpassend wenn man das für commerzielle Software nutzt oder
sogar in einem Team denn:

>> STANDARTS! <<

sorgen für wiederverwendbare, saubere und wartbare Software.
 
A

Andgalf

Gast
Meine Meinung dazu ist, dass es ganz aufs Anwendungsgebiet ankommt.
Wenn man nur für sich privat das macht ist das doch Okay,

Ok, aber dann ist es eine "Fingerübung" .... und ob die nun sauber Unit-getestet sind oder nicht ... who cares.

Allerdings fallen die Unit-Test bei TDD ja nebenbei mit ab
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Datum - Monat und Jahr werden falsch angezeigt Java Basics - Anfänger-Themen 4
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
B Monat und Jahr bitte um Hilfe Java Basics - Anfänger-Themen 8
I Auf vollen Monat prüfen? Java Basics - Anfänger-Themen 22
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
M Monat der letzen 12 Monate ermitteln Java Basics - Anfänger-Themen 8
G maximale Anzahl der Tage im Monat Java Basics - Anfänger-Themen 18
M Monat setzen Java Basics - Anfänger-Themen 18
H Monat von Datumausgabe in int konvertieren Java Basics - Anfänger-Themen 3
H Anzahl der Tage von Monat ausgeben Java Basics - Anfänger-Themen 7
H Date-Objekt um einen Monat "erhöhen" Java Basics - Anfänger-Themen 7
H Monat durchlaufen Java Basics - Anfänger-Themen 2
T Calender / DateFormat macht plus ein Monat Java Basics - Anfänger-Themen 3
D Monat vergleichen Java Basics - Anfänger-Themen 3
M wieviele Tage der Monat X hat Java Basics - Anfänger-Themen 2
W Tage im Monat Java Basics - Anfänger-Themen 3
G HILFE!!! JEDER MONAT HAT 31 TAGE Java Basics - Anfänger-Themen 2
H SimpleDataFormat.format() spuckt falsches Jahr aus (statt 1999 = 3899) Java Basics - Anfänger-Themen 7
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
M SimpleDateFormat, falsches Jahr Java Basics - Anfänger-Themen 3
E Schleife für ein Jahr mit dem GregorianCalendar Java Basics - Anfänger-Themen 1
S Ein Jahr hat 363,7 Tage ? Java Basics - Anfänger-Themen 2
A Über Jahr iterieren, Freitag der 13. Java Basics - Anfänger-Themen 2
Y Feststellen ob ein Jahr vergangen ist Java Basics - Anfänger-Themen 6
I Date um 1 Jahr erhöhen? Java Basics - Anfänger-Themen 17
C GregorianCalendar 2 Datumswerte(Differenz) auf volles Jahr prüfen Java Basics - Anfänger-Themen 4
Zed Übergang von Kalenderwochen ins neue Jahr Java Basics - Anfänger-Themen 19
T aktuelles jahr ermitteln (und nur dies) Java Basics - Anfänger-Themen 3
M Prüfen, ob Tag im Jahr kein Samstag/Sonntag ist Java Basics - Anfänger-Themen 7
J Datumsanzeige für nächstes Jahr Java Basics - Anfänger-Themen 14
A Heute - 1 Jahr Java Basics - Anfänger-Themen 2
R Woher bekomme ich das aktuelle Jahr oder auch Datum? Java Basics - Anfänger-Themen 4
J getYear() = Jahr minus 1900??? Java Basics - Anfänger-Themen 2
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
Kotelettklopfer Output korrekt trotz falschem Lösungsweg !? Java Basics - Anfänger-Themen 99
dome385 Ball Ball Kollision physikalisch korrekt Java Basics - Anfänger-Themen 5
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
tom.j85 Map - Values nicht korrekt ersetzt (Abzählspiel) Java Basics - Anfänger-Themen 13
R Compiler-Fehler HalloWelt-Programm korrekt abgeschrieben, trotzdem Fehlermeldungen Java Basics - Anfänger-Themen 2
M Strasse und Huasnummer korrekt eingeben Java Basics - Anfänger-Themen 13
D JAVA JDK korrekt installieren javac wird nicht gefunden Java Basics - Anfänger-Themen 2
C JFreeChart Linie nicht korrekt dargestellt Java Basics - Anfänger-Themen 1
M java.io.FileNotFoundException trotz dass Verzeichnis korrekt angegeben ist! Java Basics - Anfänger-Themen 20
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
E Gleitkomma zahlen mathemathisch korrekt multiplizieren Java Basics - Anfänger-Themen 5
D Abfrage ob Variableninhalt korrekt Java Basics - Anfänger-Themen 5
M JMadex funktioniert nicht korrekt Java Basics - Anfänger-Themen 8
G OOP Klassenaufbau korrekt? / MVC Java Basics - Anfänger-Themen 1
S JTabel korrekt mit Datensätzen aus ResultSet füllen Java Basics - Anfänger-Themen 4
R Upload Servlet: Ausgabe nicht korrekt Java Basics - Anfänger-Themen 2
J String Ausgabe nicht-leerer Zeichen nicht korrekt Java Basics - Anfänger-Themen 10
K Wie übergebe ich hier korrekt die Werte Java Basics - Anfänger-Themen 5
U Attributsnamen korrekt oder falsch? Java Basics - Anfänger-Themen 4
G Exe-Datei korrekt in JAR ablegen Java Basics - Anfänger-Themen 4
B func(Object ....args) korrekt weitergeben Java Basics - Anfänger-Themen 4
Burny91 Compiler-Fehler Regular Expressions matchen nicht korrekt Java Basics - Anfänger-Themen 5
M Calendar-Prüfung funktioniert nicht korrekt Java Basics - Anfänger-Themen 6
M String wird nicht korrekt ausgelesen. Java Basics - Anfänger-Themen 11
S Kapselung Member korrekt nach aussen verfügbar machen Java Basics - Anfänger-Themen 6
L Referenced Libraries korrekt in Java Applet einbinden.. Java Basics - Anfänger-Themen 2
M OOP JLabel werden nicht korrekt eingefärbt Java Basics - Anfänger-Themen 6
F JSlider korrekt implementieren Java Basics - Anfänger-Themen 19
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
R ArrayList(int index, Object) funktioniert nicht korrekt? Java Basics - Anfänger-Themen 7
S Benutzereingabe über Scanner Klasse korrekt behandeln Java Basics - Anfänger-Themen 9
L If/else nicht korrekt ausgeführt. Java Basics - Anfänger-Themen 22
K methode wird nur einmal korrekt durchlaufen Java Basics - Anfänger-Themen 4
F Verschlüsselten Text korrekt ausgeben Java Basics - Anfänger-Themen 2
Developer_X Applikation kann nicht korrekt von anderen Applikationen aufgerufen werden Java Basics - Anfänger-Themen 10
K Symbole werden nicht korrekt angezeigt ? Java Basics - Anfänger-Themen 7
G Maven Dependency für Oracle JDBC-Driver korrekt festlegen Java Basics - Anfänger-Themen 4
0x7F800000 elemente aus einer Collection korrekt löschen Java Basics - Anfänger-Themen 8
Antoras Durchschnitt ist nicht korrekt; Eingaben löschen Java Basics - Anfänger-Themen 7
G Wochentag und Jahrtag werden nicht korrekt ermittelt Java Basics - Anfänger-Themen 8
G SwingWorker funktioniert nicht korrekt Java Basics - Anfänger-Themen 16
J Ein Fenster korrekt schließen? Java Basics - Anfänger-Themen 4
U Double-Variable führt Division nicht korrekt aus Java Basics - Anfänger-Themen 4
S UML korrekt umgesetzt? Java Basics - Anfänger-Themen 14
U GUI wird nicht korrekt angezeigt Java Basics - Anfänger-Themen 8
M Kommentare - so korrekt? Java Basics - Anfänger-Themen 8
G Geöffnete Datei schreiben korrekt schreiben? Java Basics - Anfänger-Themen 6
G Warum ist der folgende Code korrekt? Java Basics - Anfänger-Themen 2
G Eingabe wird nicht korrekt eingelesen? Java Basics - Anfänger-Themen 2
G Buffered REader, String, ist mein code korrekt? Java Basics - Anfänger-Themen 4
R Look & Feel wird nicht korrekt angezeigt Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben