Berechnung der Arbeitstage in einem Zeitraum

Sherry

Aktives Mitglied
Hallo,

ich habe mir zur Aufgabe gemacht, die Arbeitstage zwischen zwei Daten zu ermitteln. Da gelten in meiner Klasse der Samstag, Heiligabend und Silvester nicht als Arbeitstage.
Java:
package com.example.workingDays;

import org.joda.time.Days;
import org.joda.time.LocalDate;

/**
 * 
 * The parameters startDate and endDate are strings. calculateDays calculates the number
 * of project days in Germany between the two dates.
 */
public class WorkingDays {

	/**
	 * @param startDate, endDate
	 */
	public int calculateDays(String startDate, String endDate) {
		DateDisassembler d = new DateDisassembler();
		LocalDate date1 = new LocalDate(d.disassemble(startDate)[2], d.disassemble(startDate)[1], d.disassemble(startDate)[0]);
    	LocalDate date2 = new LocalDate(d.disassemble(endDate)[2], d.disassemble(endDate)[1], d.disassemble(endDate)[0]);
    	/*
    	 * Calculates the weekend days
    	 */
    	int weekend = 0;
    	int count = 0;
    	Eastern easterHolidays = new Eastern();
    	for (LocalDate date = date1; date.isBefore(date2); date = date.plusDays(1)) {
    		if (date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7) {
    			weekend++;
    		}
    		count++;
    	}
    	System.out.println(count);
    	/*
    	 * Calculates the German holidays
    	 */
    	int holidays = 0;
    	for (LocalDate date = date1; date.isBefore(date2); date = date.plusDays(1)) {
    		int year = date.getYear();
    		// New Year's Day
    		if (date.getMonthOfYear() == 1 && date.getDayOfMonth() == 1 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
    			holidays++;
			}
    		// Epiphany
    		if (date.getMonthOfYear() == 1 && date.getDayOfMonth() == 6 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
    			holidays++;
			}
    		// Good Friday
    		if (date.toString().equals(easterHolidays.calculate(year, 1))) {
    			holidays++;
			}
    		// Easter Monday
    		if (date.toString().equals(easterHolidays.calculate(year, 2))) {
    			holidays++;
			}
    		// Ascension Day
    		if (date.toString().equals(easterHolidays.calculate(year, 3))) {
    			holidays++;
			}
    		// Whit Monday
    		if (date.toString().equals(easterHolidays.calculate(year, 4))) {
    			holidays++;
			}
    		// Corpus Christi
    		if (date.toString().equals(easterHolidays.calculate(year, 5))) {
    			holidays++;
			}
    		// Labor Day
    		if (date.getMonthOfYear() == 5 && date.getDayOfMonth() == 1 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
    			holidays++;
			}
    		// German Unity Day
    		if (date.getMonthOfYear() == 10 && date.getDayOfMonth() == 3 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    		// All Saints
    		if (date.getMonthOfYear() == 11 && date.getDayOfMonth() == 1 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    		// Christmas Day
    		if (date.getMonthOfYear() == 12 && date.getDayOfMonth() == 24 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    		if (date.getMonthOfYear() == 12 && date.getDayOfMonth() == 25 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    		if (date.getMonthOfYear() == 12 && date.getDayOfMonth() == 26 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    		// New Year's Eve
    		if (date.getMonthOfYear() == 12 && date.getDayOfMonth() == 31 && !(date.getDayOfWeek() == 6 || date.getDayOfWeek() == 7)) {
				holidays++;
			}
    	}
    	Days days = Days.daysBetween(date1, date2);
    	int diffDays = 1+days.getDays();
    	System.out.println("Differenz:    " + diffDays);
    	System.out.println("Wochenenden : " + weekend);
    	System.out.println("Feiertage   : " + holidays);
		return diffDays - weekend - holidays;
		
	}

}

DateDisassembler macht aus "12.5.2014" 12, 5 und 2014 zur Weiterverarbeitung.

Java:
/**
 * Eastern.java
 */
package com.example.workingDays;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;


public class Eastern {
	private String eastern;

	/**
	 * @param year, index
	 * The parameter year is given as a integer and must be greater than 1593.
	 * The parameter index is a integer for Good Friday (1), Easter Monday (2),
	 * Ascension (3), Whit Monday (4) and Corpus Christi (5).
	 * Return value is a string with the date of the selected holiday.
	 */
	public String calculate(int year, int index) {
		int y = year;
		int g = y % 19;
	    int c = y / 100;
	    int h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;
	    int i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11));
	    int j = (y +y / 4 + i + 2 - c + c / 4) % 7;
	    int l = i - j;
	    int monat = 3 + (l + 40) / 44;
	    int day = l + 28 - 31 * (monat / 4);
	    int difference = 0;
	    switch (index) {
		case 1:
			difference = -2;
			break;
		case 2:
			difference = 1;
			break;
		case 3:
			difference = 39;
			break;
		case 4:
			difference = 50;
			break;
		case 5:
			difference = 60;
			break;
		}
	    DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
	    Calendar easternSunday = new GregorianCalendar();
	    easternSunday.set(y, monat-1, day);
	    easternSunday.add(Calendar.DAY_OF_MONTH, difference);
	    eastern = dateFormat.format(easternSunday.getTime());
		return eastern;
	}
}

Java:
package com.example.WorkingDays;

public class MainTest {

	public static void main(String[] args) {
		WorkingDays d = new WorkingDays();
		System.out.println("Anzahl der Arbeitstage: " + d.calculateDays("1.10.2014", "31.10.2014"));
	}

}

Ich suche gerade eine Abweichung der Anzahl der Arbeitstage, die ich mir im Code nicht erklären kann.
Führe ich die Klassen für 1.10.2014 bis 31.10.2014 aus, erhalte ich 22 Tage, was auch stimmt.
Für 1.11.2014 bis 30.11.2014 erhalte ich 21 Tage, korrekt sind aber nur 20 Tage. Über mehrere Monate schleichen sich so Differenzen ein.
Ich finde allerdings nicht den Fehler in meinem Denkansatz. Vielleicht seht ihr ihn und könnt mir weiterhelfen.
Grüße und besten Dank
Sherry
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
........
Ich suche gerade eine Abweichung der Anzahl der Arbeitstage, die ich mir im Code nicht erklären kann.
........
Ich finde allerdings nicht den Fehler in meinem Denkansatz. Vielleicht seht ihr ihn und könnt mir weiterhelfen.

Kleiner Tipp um deinen Fehler vielleicht leichter zu finden (ohne das ich mir den Code genau angeschaut habe).
In der Methode "WorkingDays.calculateDays(...)" hast du eine Schleife um die Ferien und Feiertage zu zählen, füge bei jedem Fall eine passende Konsolen-/Logausgabe ein.
Damit kannst du leichter nachvollziehen welche Feiertage/Ferien dein Code gefunden hat.
 

d.fuhri

Mitglied
Hallo

Der letzte Tag wird nicht auf Weekend verglichen.
Es ist nur date < date2 und nicht date <= date2.

Java:
for (LocalDate date = date1; date.isBefore(date2); date = date.plusDays(1))
Gruss
 
Zuletzt bearbeitet:

Sherry

Aktives Mitglied
Erstmal besten Dank Joose für den Tipp mit der Schleifenreduzierung und Deine PM.

Und das hier sehe ich jetzt auch:
Hallo

Der letzte Tag wird nicht auf Weekend verglichen.
Es ist nur date < date2 und nicht date <= date2.

Java:
for (LocalDate date = date1; date.isBefore(date2); date = date.plusDays(1))
Gruss
Das ist jetzt die Frage ob JodaTime neben isBefore() auch ein isBeforeAndEqual() anbietet, oder wie ich die zusätzliche Abfrage einbaue.

Grüße

Sherry
 

Sherry

Aktives Mitglied
Mit dieser Erweiterung hier
Code:
for (LocalDate date = date1; date.isBefore(date2) || date.isEqual(date2); date = date.plusDays(1)) {
klappt es jetzt auf kurze Zeiträume.
Dennoch der Zeitrraum 01.10.2014 bis 01.10.2015 liefert bei mir 254 Tage, richtig wären aber 249 Tage. Da bin ich noch am Suchen.

Grüße

Sherry
 
Zuletzt bearbeitet:

Sherry

Aktives Mitglied
Das Thema hier gilt für mich als gelöst.
In Eastern.java muss lediglich
Code:
 DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
gegen
Code:
 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
ausgetauscht werden.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
S Hashcode-Berechnung + ^ Java Basics - Anfänger-Themen 2
J Median-Berechnung von 2D-Teilarrays Java Basics - Anfänger-Themen 56
F Tabelle - Berechnung Rang Java Basics - Anfänger-Themen 2
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
S Berechnung der sleep time ist falsch Java Basics - Anfänger-Themen 46
S Switch-Case zur Berechnung der Einkommensteuer Java Basics - Anfänger-Themen 15
F Berechnung der Rektaszension und Deklination eines Sterns Java Basics - Anfänger-Themen 7
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
V Erste Schritte Pi Berechnung Java Basics - Anfänger-Themen 47
M Berechnung der Reststrecke bei Graphen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
B Berechnung zu einer Schleife formen Java Basics - Anfänger-Themen 6
B Berechnung Median mit Methode Java Basics - Anfänger-Themen 7
CptK Methoden Berechnung von Anfangsgeschwindigkeit und Winkel Java Basics - Anfänger-Themen 27
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
S Erste Schritte Berechnung des Paketportos - Problem/Frage Java Basics - Anfänger-Themen 52
J Gleitkommazahlen, Berechnung von pi Java Basics - Anfänger-Themen 4
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
Salo Berechnung von Winkeln Java Basics - Anfänger-Themen 28
M Restbuchwert Berechnung geht nicht Java Basics - Anfänger-Themen 45
Ghostman1711 Pi berechnung Methode aufrufen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
N Verzögerte Berechnung "Lazy" Java Basics - Anfänger-Themen 8
J Erste Schritte Rundungsproblem - Berechnung Notendurchschnitt Java Basics - Anfänger-Themen 13
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
M Berechnung in Java Java Basics - Anfänger-Themen 4
E Problem bei rekursiver Berechnung des Binomialkoeffizienten Java Basics - Anfänger-Themen 5
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
C Nach Berechnung runden und Wert ausgeben Java Basics - Anfänger-Themen 7
E Berechnung für Shop einbinden Java Basics - Anfänger-Themen 8
S Klassen Formel zur Berechnung .... Bitte um Hilfe Java Basics - Anfänger-Themen 7
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
P Schleife zur Berechnung von einer Summe Java Basics - Anfänger-Themen 16
F Berechnung einer linearen Abschreibung Java Basics - Anfänger-Themen 5
E Berechnung von Punkten Java Basics - Anfänger-Themen 4
D Berechnung des Abstandes von zwei Punkten in einem Koordinatensystem Java Basics - Anfänger-Themen 14
A Methoden PI-Berechnung Java Basics - Anfänger-Themen 22
S Erste Schritte Berechnung mit Daten aus CSV und Date Objekt Java Basics - Anfänger-Themen 2
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
A Erste Schritte Steuer Berechnung, Alters Abhängig Java Basics - Anfänger-Themen 5
T Erste Schritte Berechnung von gerade und ungerade Zahlen Java Basics - Anfänger-Themen 10
J Erste Schritte Berechnung Ratten vermehrung Java Basics - Anfänger-Themen 4
P falsches ergebnis bei einfacher berechnung Java Basics - Anfänger-Themen 3
T Iterative Berechnung einer Satellitenbahn Java Basics - Anfänger-Themen 20
M Java Berechnung mit mehreren Lösungen? Java Basics - Anfänger-Themen 9
D Nullstellen-Berechnung Java Basics - Anfänger-Themen 10
L Fehlermeldung bei falscher Berechnung anzeigen Java Basics - Anfänger-Themen 31
A berechnung multiplikatives inverses Java Basics - Anfänger-Themen 5
J Berechnung des aktuellen Alters auf Basis des Geburtstags Java Basics - Anfänger-Themen 45
J Datentypen Fehler bei Berechnung mit Double und Int-Werten Java Basics - Anfänger-Themen 22
G Berechnung von Winkeln mit Cosinussatz Java Basics - Anfänger-Themen 2
B Arrays verwenden für Berechnung Java Basics - Anfänger-Themen 3
R Merkwürdige Modulo Berechnung Java Basics - Anfänger-Themen 7
B Hausaufgabe Berechnung quadratischer Funktion Java Basics - Anfänger-Themen 16
U Alter Berechnung + sortierung Java Basics - Anfänger-Themen 6
P Berechnung wird nicht durchgeführt Java Basics - Anfänger-Themen 2
D Berechnung von Ostern und Ramadan! Java Basics - Anfänger-Themen 24
N Algorithmus für Berechnung einer Quersumme Java Basics - Anfänger-Themen 9
D Berechnung von Geldausgabe Java Basics - Anfänger-Themen 22
F Berechnung von Kugeln! Java Basics - Anfänger-Themen 9
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
S Hausaufgabe: Java-Programm schreiben zur Berechnung von x und y Java Basics - Anfänger-Themen 9
Y Ergebnis einer Berechnung an die Main Methode übergeben Java Basics - Anfänger-Themen 11
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
J Logarithmische Berechnung und Arrays Java Basics - Anfänger-Themen 2
B LinkedList - Berechnung des Produkts Java Basics - Anfänger-Themen 6
B Berechnung von Preisen per Java-Programm Java Basics - Anfänger-Themen 27
M Alters berechnung aus Geburtsjahr aus dem Buch Java Basics - Anfänger-Themen 5
O Fehler in der String-Distanz-Berechnung Java Basics - Anfänger-Themen 5
-horn- "Berechnung vorwärts, Optimierung rückwärts?" - Wie würdet ihr das machen? Java Basics - Anfänger-Themen 8
P iterative Berechnung Java Basics - Anfänger-Themen 9
1 Berechnung von PI mithilfe von Buffons Nadelproblem Java Basics - Anfänger-Themen 2
G Berechnung zwei Komplexen Zahlen Java Basics - Anfänger-Themen 34
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
J Programm für interaktive Berechnung von Temperaturverläufen Java Basics - Anfänger-Themen 9
K Annährende ganzzahlige Berechnung der Wurzel Java Basics - Anfänger-Themen 8
L Berechnung von Perioden Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
S Euklid Klasse mit Methoden zur Berechnung des ggT Java Basics - Anfänger-Themen 23
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
G Berechnung von N-Tageslinien von Aktienkursen Java Basics - Anfänger-Themen 13
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
W Schaltjahr Berechnung Java Basics - Anfänger-Themen 24
A Probleme mit Programm zur Pi-Berechnung Java Basics - Anfänger-Themen 6
X Temperatur-Berechnung /Array(?) Java Basics - Anfänger-Themen 5
L Berechnung Summe Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben