# Werktag bestimmen



## dodovic (16. Okt 2012)

Hi ihr Lieben!

Ich bräuchte Hilfe bei einer Hausaufgabe, die lautet:

Bei einer Jobsteuerung handelt es sich um die Verwaltung eines oder mehrerer
Programme, die üblicherweise im Hintergrund ablaufen. Jedes einzelne dieser Programme
bezeichnet man als Job.

Gegeben sei eine Jobsteuerung in einer betriebswirtschaftlichen Anwendung. Über diese
Jobsteuerung sollen Jobs unter folgenden Bedingungen laufen:
Die Jobs dürfen ausschließlich an Werktagen laufen. An Wochenenden und Feiertagen
sind Jobs auszusetzen.

Ein Job läuft werktäglich. Bestimmen Sie zu einem gegebenen Datum, ob es sich dabei
um ein Werk- oder Sonn-/Feiertag handelt. Sollte es sich um einen Nicht-Werktag
handeln, so bestimmen Sie den nächstmöglichen nachfolgenden (!) Werktag.

Ein weiterer Job muss zum Monatsultimo (Monatsletzter) laufen. Wieder gilt, dass dieser
Job nicht an Sonn-/Feiertagen abläuft. Sollte es sich um einen Sonn-/Feiertag handeln, so
ist der nächstmögliche vorherige (!) Werktag zu bestimmen. Berechnen Sie zu einem
gegebenen Monat (Eingabe Monat und Jahr) diesen Monatsultimo.

Alle Berechnungen sollten sich auf Daten ab dem 1.1.2000 beziehen. Maßgeblich ist der
gregorianische Kalender.

Als Feiertage gelten :
• Neujahr
• alle Ostertage (Karfreitag, Samstag, Ostersonntag und Ostermontag)
• der 1. Mai
• der 3. Oktober
• Hl. Abend, sowie der erste und zweite Weihnachtsfeiertag
• Silvester

Nun weiß ich nicht wie anfangen soll. Soll man ein Startdatum setzen oder nicht? Und wie berechnet man die Feiertage? (oder werden sie fest gesetzt?)

Freue mich auf eure Hilfe! 

Herzlichst

dodovic


----------



## Bernd Hohmann (16. Okt 2012)

Eigentlich müsste man jetzt sagen "nimm Joda-Time", aber das wirst Du (da externes Paket) nicht nutzen dürfen.

Ich hab schon lange nix mehr mit den Kalendern gemacht.

Ein guter Einstiegspunkt wäre ein Artikel in der Insel über die Gregorianischen Kalenderfunktionen. Dort findest Du auch gleich eine Funktion für die Errechnung von Ostern - das brauchst Du.

Wie dort beschrieben den Kalender mit der korrekten Zeitzone (würde ich fix auf Deutschland setzen) und Locale DE erzeugen, nicht vergessen den ersten Wochentag auf MONDAY zu setzen ("setFirstDayOfWeek(GregorianCalendar.MONDAY);")

Dann bleibt die Frage, ob Samstag ein Werktag ist (vermutlich nicht, mich macht aber stutzig dass der Ostersamstag ein Nicht-Werktag sein soll).

Zuerst brauchst Du eine Routine, die zurückgibt ob der Tag ein Werktag ist (!=SATURDAY && !=SUNDAY) bzw. ein Feiertag ist ( Also Ostersonntag -2,-1,+0,+1 für Karfreitag ... Ostermontag und die anderen Feiertage sind fixes Datum).

Teilaufgabe 1: den GregorianCalendar mit dem übergebebenen Datum füttern und durch die Routine oben schleusen. Im Fehlerfall mit add() am Kalender hochzählen bis Du auf einen Werktag kommst und sich vom Kalender das Date geben lassen und zurückgeben.

Teilaufgabe 2: das gleiche in Grün, nur dass bei add(...) negative Werte angegeben werden um zurückzuspulen.

Du solltest (damit es später keinen Huddel gibt) im java.util.Date oder im Kalender die Stunde/Minute/Sekunde auf 0 setzen.

Bernd


----------



## gp (16. Okt 2012)

Auch wenn man es nicht glauben will und die Erfahrung vielleicht dagegen spricht: Samstage sind Werktage. Sollte man eigentlich beim Führerschein gelernt haben 

Gesendet von meinem GT-P7501 mit Tapatalk 2


----------



## Bernd Hohmann (16. Okt 2012)

gp hat gesagt.:


> Auch wenn man es nicht glauben will und die Erfahrung vielleicht dagegen spricht: Samstage sind Werktage. Sollte man eigentlich beim Führerschein gelernt haben



Du natürlich recht (Korrekte Fundstelle ist allerdings §3 Abs 2 Bundesurlaubgsgesetz: "(2) Als Werktage gelten alle Kalendertage, die nicht Sonn- oder gesetzliche Feiertage sind."

Nur bin ich da bei der konkreten Implementation ganz vorsichtig geworden und würde daher erstmal nachfragen ob der Samstag als Werktag gelten soll (manchmal bekannt als "Bürowoche Mo-FR"). 

Man kann es aber auch geschickt lösen und eine Enum WORKDAY einführen 

Bernd


----------



## gp (17. Okt 2012)

Bernd Hohmann hat gesagt.:


> Nur bin ich da bei der konkreten Implementation ganz vorsichtig geworden und würde daher erstmal nachfragen ob der Samstag als Werktag gelten soll (manchmal bekannt als "Bürowoche Mo-FR").



Dem kann ich nur zustimmen, zumal oben auch von "Wochenende" gesprochen wird. Es ist die übliche unklare Anforderung, die muss vor der Umsetzung hinterfragt werden. 

Ansonsten kann ich im "wirklichen" Leben nur dazu raten für "Datumsangelegenheiten" auf externe Module zuzugreifen (die Osterberechnung wurde schon erwähnt, allein die Definition, wann ein Jahr ein Schaltjahr ist, dürfte den wenigsten bekannt sein )

Günter


----------



## TryToHelp (17. Okt 2012)

Also so wie ich das verstehe, sollst du dafür keine externe Funktion nehmen, sondern es selber errechnen, und zwar als Startwert den 1.1.2000.

Somit solltest du als Schritt eins rechercieren, was das für ein Wochentag war. Dann sollte es ja bekannt sein, wieviele Tage das Jahr hat, das sind so ungefähr 365, gibt da immer mal abweichungen, aber auch dafür gibt es lösungen, google wird dir im notfall helfen. eine Woche hat 7 Tage, und diese wiederholen sich Zyklisch, somit die Anzahl Tage seit 1.1.2000%7 weißt du welcher Wochentag-Tag ist ;-) Die Feiertage außer Ostern sind ziemlich einfach, da sie immer die selben sind ;-) Ostern sieht da leider anders aus :-(


----------

