Laden...

Kalenderrechner für tatsächliche Arbeitstage

Erstellt von RBA285 vor 13 Jahren Letzter Beitrag vor 10 Jahren 43.720 Views
R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren
Kalenderrechner für tatsächliche Arbeitstage

Hi Forengemeinde,

wer einen Kalenderrechner für die Berechnung von tatsächlichen
Arbeitstagen benötigt, soll sich die Klasse in der Anlage ansehen.

Berücksichtigt werden Wochenenden und Feiertage (alle Bundesländer).
Zudem lassen sich betriebliche "Feiertage" wie z.B. Rosenmontag flexibel
hinzufügen und entfernen.

So funktionierts:

KalenderRechner meinKalender = new KalenderRechner( KalenderRechner.BundesLänder.Bayern );

Wird das Bundesland-Enum im Konstruktor weggelassen, ziehen automatisch
die bundeseinheitlichen Feiertage.

Möchte man "Feiertage" hinzufügen, geht das z.B. einfach über:

meinKalender.AddFeiertag(KalenderRechner.Feiertage.AugsburgerFriedensfest);

Und wieder weg:

meinKalender.RemoveFeiertag(KalenderRechner.Feiertage.AugsburgerFriedensfest);

Die für das jeweilige Bundesland einheitlichen Feiertage sind immer
richtig vorbelegt! Gibt es Feiertage die innerhlb des Bundeslands nicht
einheitlich sind, müssen diese mit der Add-Methode hinzugefügt werden.
Das gleiche gilt für evtl. betriebliche Feiertage wir Rosenmontag usw.

Wenn Samstage als Arbeitstage zählen:

meinKalender.SamstagIstArbeitstag = true;

Für Sonntage sinngemäß.

Beispiel-Berechnung der tatsächlichen Arbeitstage zwischen zwei Datumswerten:

uint tage = meinKalender.GetArbeitstage(new DateTime(2009, 12, 6), new DateTime( 2010, 11, 10));

Datum 1 = Beginndatum
Datum 2 = Endedatum

Zurückgegeben werden nur die tatsächlichen Arbeitstage unter Berücksichtigung
von Feiertagen und Wochenenden.

Weitere Member und Methoden:

public bool IsFeiertag(DateTime dtDate)
public Feiertage GetFeiertagName(DateTime dtDate)
public DateTime GetFeiertagDatum(Feiertage feiertag, int iYear)
public DateTime GetOstersonntag(int iYear)

Liste (Enum) der bisher implementierten, möglichen Feiertage:


            Neujahr,
            HeiligeDreiKönige,
            Valentinstag,
            RosenMontag,
            FaschingsDienstag,
            Aschermittwoch,
            GrünDonnerstag,
            Karfreitag,
            OsterSonntag,
            OsterMontag,
            Muttertag,
            TagDerArbeit,
            ChristiHimmelfahrt,
            PfingstMontag,
            PfingstSonntag,
            Fronleichnam,
            AugsburgerFriedensfest,
            MariaHimmelfahrt,
            TagDerDeutschenEinheit,
            Reformationstag,
            Allerheiligen,
            BußUndBettag,
            Nikolaus,
            ErsterAdvent,
            ZweiterAdvent,
            DritterAdvent,
            VierterAdvent,
            Heiligabend,
            ErsterWeihnachtsfeiertag,
            ZweiterWeihnachtsfeiertag,
            Sylvester,
            KeinFeiertag

Für konstruktives Feedback bin ich wie immer dankbar.

Robin

EDIT: Weiter unten gibt es eine aktuellere Version.

U
1.578 Beiträge seit 2009
vor 13 Jahren

Sieht echt gut aus, wenn nicht alles Deutsch wäre wär es auch prima zu verwenden 😉
Sonntagsarbeit geht nicht?
Kann man sich die vorbelegten Feiertage anzeigen lassen?

Wenn schon deutsch dann korrigiere mal 😁
"Sylvester" -> "Silvester"
"MariaHimmelfahrt" -> "MariäHimmelfahrt"

U
208 Beiträge seit 2008
vor 13 Jahren

Sieht echt gut aus, wenn nicht alles Deutsch wäre wär es auch prima zu verwenden 😉

in wie weit schränkt eines das ein?
und überhaupt, ist das eh total schwachsinnig. gib mir mal die englischen begriffe für die deutschen feiertage. man kann's auch echt übertreiben...

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren

Hallo Zusammen,

danke für das Feedback. Normalerweise kommentiere ich alles in
Englisch und verwende auch nur englische Variablen/Begriffe (s. auch das
Game, dass ich hier veröffentlicht habe), da ich manches auch in US-Foren
poste.

Allerdings ist dieser Feiertagskalender sehr stark an den deutschen
Sprachraum gekoppelt, so dass ich mich genaus aus diesem Grund hier
für die deutschen Begriffe entschieden habe. Vor allem, da es bei vielen
Sonder- und Feiertagen m.W. keinen entsprechenden englischen Begriff gibt,
bzw. dieser wiederum im Deutschen unbekannt ist.

Ich möche in diesem Zusammenhang noch auf eine Besonderheit der
Arbeitstageberechnung in diesem Modul hinweisen: Sie ist m.M. im
Vergleich zu anderen Lösungen die ich bisher gesehen habe sehr schnell und
eignet sich deshalb auch für umfangreiche Bearbeitungen, z.B. in Verbindungen
mit Datenbanken.

Robin

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren

Sonntagsarbeit geht nicht?

Doch, steht doch in der Erklärung bei dem Beispiel für Samstag:
Gilt sinngemäß für Sonntag, also

meinKalender.SonntagIstArbeitstag = ...

Kann man sich die vorbelegten Feiertage
anzeigen lassen?

Liegen als Enum List-Elemente vor, können somit über eine einfache Property
nach aussen geführt werden. Ist nun drin:

public List<Feiertage> GetFeiertagList

Wenn schon deutsch dann korrigiere mal 😁
"Sylvester" -> "Silvester"
"MariaHimmelfahrt" -> "MariäHimmelfahrt"

In der Anlage mit den besprochenen Korrekturen. 😁

Robin

EDIT: Weiter unten gibt es eine aktuellere Version.

U
1.578 Beiträge seit 2009
vor 13 Jahren

in wie weit schränkt eines das ein?

Wenn eine Applikation komplett in Englisch geschrieben ist, und davon geh ich aus, ist es sehr unschön plötzlich Deutsche sachen zu finden, vor allem wenn Kollegen daran gehen die kein Wort Deutsch können 😉

U
1.578 Beiträge seit 2009
vor 13 Jahren

und überhaupt, ist das eh total schwachsinnig. gib mir mal die englischen begriffe für die deutschen feiertage. man kann's auch echt übertreiben...

Bitteschön:
NewYear,
Epiphany,
ValentinesDay,
RoseMonday,
ShroveTuesday
AshWednesday
MaundyThursday,
GoodFriday,
EasterSunday
EasterMonday
MothersDay,
DayWork
Ascension,
WhitMonday
WhitSunday
CorpusChristi,
AugsburgPeaceFestival,
Assumption,
DayOfGermanUnity,
Reformation,
AllSaints,
RepentanceAndPrayer,
Nicolas,
FirstAdvent,
SecondAdvent,
ThirdAdvent
FourthAdvent,
ChristmasEve
ChristmasDay,
SecondDayOfChristmas,
Sylvester,
NoHoliday

Zum einen sind Alle Feiertage aller Länder im Englischen übersetzt, und zum anderen gibt es in der Library auch Denglische Methoden:

public bool IsFeiertag(DateTime dtDate)
public Feiertage GetFeiertagName(DateTime dtDate)
public DateTime GetFeiertagDatum(Feiertage feiertag, int iYear)
public DateTime GetOstersonntag(int iYear)
meinKalender.AddFeiertag(KalenderRechner.Feiertage.AugsburgerFriedensfest);
meinKalender.RemoveFeiertag(KalenderRechner.Feiertage.AugsburgerFriedensfest);

Was soll der Quatsch, Add, Get, Remove, Is passt aber dann das Deutsche "Feiertag", das ist doch ne Zumutung.

Das zerstört die sonst sehr gute Arbeit!

//Quote tag nicht gepasst

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo RBA285,

da die Feiertage gesetzlich festgelegt sind und sich diese Gesetze durchaus mal ändern (man denke nur an den "Tag der Deutschen Einheit" oder den "Buß- und Bettag"), würde ich empfehlen, die Feiertage gar nicht in den Code zu packen, sondern in Konfigurationsdateien abzulegen. Das löst dann gleich auch das Problem mit der Sprache, weil man dann ja die Sprache frei wählen kann. Will man eine andere Sprache, übersetzt man einfach die Konfigurationsdatei.

Außerdem sollten die Konfigurationsdateien die Möglichkeit bieten, einen Gültigkeitszeitraum anzugeben, der dann von der Bibliothek auch berücksichtigt wird. Immerhin kann man ja auf den Gedanken kommen, die Zahl der Arbeitstag über mehrere Jahre (z.B. zwischen 1985 und 2000) zu berechnen und innerhalb dieser Zeit hat sich ja die Lage des "Tags der Deutschen Einheit" geändert und der "Buß- und Bettag" wurde in den meisten Bundesländern abgeschafft.

herbivore

U
1.578 Beiträge seit 2009
vor 13 Jahren

Finde ich eine erstklassige Idee 😃
Der vorteil ist dann auch das man dann die Selben Klassen auch für andere Länder verwenden kann 😃

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren

Außerdem sollten die Konfigurationsdateien die Möglichkeit
bieten, einen Gültigkeitszeitraum anzugeben, der dann von der Bibliothek auch
berücksichtigt wird. Immerhin kann man ja auf den Gedanken kommen, die Zahl
der Arbeitstag über mehrere Jahre (z.B. zwischen 1985 und 2000) zu berechnen
und innerhalb dieser Zeit hat sich ja die Lage des "Tags der Deutschen Einheit"
geändert und der "Buß- und Bettag" wurde in den meisten Bundesländern
abgeschafft.

Hallo herbivore,

lauter gute Ideen und anbei ist die Umsetzung 😃

Grundlage des neuen Konstrukts ist eine universelle Feiertagsmatrix, die sich aus
zwei XML-Files füllt. Die erste XML-Datei beschreibt die möglichen geographischen
Regionen (bei uns z.B. Bundesländer) mit den Country und Language als
globale Keys/Matchcodes. Die Struktur sieht wie folgt aus (Auszug):


<?xml version="1.0" encoding="utf-8"?>
<States.Config>
  <Country>
    <CountryCode>DE</CountryCode>
    <Language>DE</Language>
    <States>
      <State>
        <StateID>0</StateID>
        <StateName>Catalog</StateName>
      </State>
      <State>
        <StateID>1</StateID>
        <StateName>Deutschland Gesamt</StateName>
      </State>
      <State>
        <StateID>2</StateID>
        <StateName>Bayern</StateName>
      </State>
    </States>
  </Country>
</States.Config>

Mit dem Ländercode (hier: "DE") und dem Sprachcode (hier: "DE") legt man
den Gültigkeitsbereich für eine (Bundes-)Staatenliste fest. So sind auch
innerhalb eines Landes verschiedene Sprachen abbildbar und innerhalb
eines Landes anhand der Sprache sogar unterschiedliche Ausprägungen.

Das XML-File für die Feiertage hat einen ähnlichen Aufbau (Auszug):
CountryCode und Language müssen bei beiden Files matchen!


?xml version="1.0" encoding="utf-8"?>
<Holidays.Config>
  <Country>
    <CountryCode>DE</CountryCode>
    <Language>DE</Language>
    <Catalog>
      <Holiday>
        <HolidayID>10</HolidayID>
        <HolidayName>Neujahr</HolidayName>
        <HolidayFormula>F:1.1</HolidayFormula>
        <HolidayDuration>1</HolidayDuration>
        <HolidayValidFrom>01.01.1900</HolidayValidFrom>
        <HolidayValidTo>31.12.2099</HolidayValidTo>
        <StateIDList>0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17</StateIDList>
      </Holiday>
      <Holiday>
        <HolidayID>20</HolidayID>
        <HolidayName>HeiligeDreiKönige</HolidayName>
        <HolidayFormula>F:6.1</HolidayFormula>
        <HolidayDuration>1</HolidayDuration>
        <HolidayValidFrom>01.01.1900</HolidayValidFrom>
        <HolidayValidTo>31.12.2099</HolidayValidTo>
        <StateIDList>0,2,3,15</StateIDList>
      </Holiday>
     </Catalog>
  </Country>
</Holidays.Config>

Die StateIDList gibt an, für welche (Bundes-)Länder der jeweilige Feiertag
gültig ist. Dabei ist "0" das Minimum, die 0 steht für den Catalog, d.h. in
diesem befinden sich alle Feiertage. Mit Duration lassen sich sogar "Feiertage"
realisieren, die mehrtägig sind.

Mit dem integrierten Formel-Parser kann man eigene Formeln für die
Feiertagsberechnung mitgeben und neue Feiertage berechnen lassen.

Der Aufbau einer Feiertagsformel sieht wie folgt aus: "Typ:Modifizierer"

Beispiele:
F:1.1 // Fester Feiertag am 1.1 (Neujahr)
E:0 // Ostersonntag
E:1 // Ostermontag
E:-2 // Karfreitag
RP:0 // Buß- und Bettag
MD:0 // Muttertag
AD:0 // Vierter Advent
AD:-7 // Dritter Advent

Ausser dem festen Feiertag "F", dem als Modifizierer immer Tag und Monat mit
Punkt getrennt mitgegeben werden, haben alle anderen Feiertagstypen
("floating") einen Offset, der ausgehend von einem anderen Feiertag berechnet
werden kann (meist ausgehend von Ostersonntag).

Klingt evtl. kompliziert, die Handhabung ist aber recht einfach:

Die XML-Files werden mit der HolidayMatrix-Klasse eingelesen:


HolidayMatrix holidayMatrix = new HolidayMatrix("DE", "DE", @"D:\states.config.xml", @"D:\holidays.config.xml");
holidayMatrix.CurrentStateID = 2;  // Bayern als Bundesland setzen

Wichtig ist, die StateID-Property richtig zu setzen (ID des Bundeslandes aus
der XML-Datei), ansonsten zieht default ID=0, dass ist der Catalog, d.h. alle in der
XML-Datei für das Land definierten Feiertage inkl. Muttertag & Co.!
In diesem Fall steht die 2 für Bayern (0=Catalog, 1=BaWü, 2 = Bayern usw.).

Dann wird die Matrix auf den eigentlichen Rechner gemappt:


CalendarCalculator calendar = new CalendarCalculator( holidayMatrix );

Und schon kann man rechnen:


 int days = calendar.GetWorkingDays(new DateTime(2010, 3, 31), new DateTime( 2010,5, 3));

Die üblichen Properties stehen auch wieder zur Verfügung:


HolidayMatrix.Holidays  // Liefert Liste aller Feiertage des gewählten Landes, Untergruppe Sprache und Untergruppe Bundesland/State

CalendarCalculator.IsHoliday( DateTime )
CalendarCalculator.GetHolidayName( DateTime )

CalendarCalculator.SaturdayIsWorkingDay = false;  // Samstag Arbeitstag ja/nein
CalendarCalculator.SundayIsWorkingDay = false;    // Sonntag Arbeitstag ja/nein

usw. usf. Alles andere steht in der Source, ist dokumentiert.
Beigefügt sind ausserdem noch die XML-Dateien für Deutschland komplett
(Alle Bundesländer+Alle Feiertage).

Robin

U
1.578 Beiträge seit 2009
vor 13 Jahren

Klasse Arbeit, gefällt mir 🙂

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren

Klasse Arbeit, gefällt mir 🙂

Danke 😁

Die SAP-Schnittstelle wird dann kostenpflichtig. 😉

Robin

U
1.578 Beiträge seit 2009
vor 13 Jahren
Hinweis von herbivore vor 13 Jahren

Reine Geschmacksfragen zum Coding/Syntax-Stil entfernt. Deshalb beginnt die Liste erst bei Punkt 4.

Weiß nicht ob es hier hin gehört, aber wo sonst.

Habe mal dein source durch geschaut, haette da ein paar fragen.

  1. Oft nimmst du werte aus der XML ohne Validierung, das kann sehr gefärlich werden.
    4a. Du machst oft int.Parse, dh du gehst immer davon aus das es zu parsen ist
    4b. Im "Holiday" splittest du Formula an dem punkt und verwendest Item 0 und 1 direkt, keine Überprüfungen ob vorhanden.

  2. Du überprüft nicht ob die übergebenen Xml Dateien überhaupt existieren vor dem einlesen

  3. Sicher das Convert.ToDateTime so immer korrekt arbeitet? Auch in jeder Culture? Bin nicht sicher das eine Englische Culture die Deutsche Syntax validiert, müsste man schauen wie man das löst.

Du solltest einiges für die Sicherheit tun, vor allem wenn die Xml Datei vom Benutzer erstellt wird, und das auch von verschiedenen Cultures aus.

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren
  1. Oft nimmst du werte aus der XML ohne Validierung, das kann sehr gefärlich
    werden.
    4a. Du machst oft int.Parse, dh du gehst immer davon aus das es zu parsen ist
    4b. Im "Holiday" splittest du Formula an dem punkt und verwendest Item 0 und 1
    direkt, keine Überprüfungen ob vorhanden.

  2. Du überprüft nicht ob die übergebenen Xml Dateien überhaupt existieren vor
    dem einlesen

Die Validierung des XML geschieht beim Einlesen. Wenn etwas nicht stimmt
wird eine Exception geworfen. Natürlich könnte man noch schöne
Fensterchen mit Hinweisen bauen, wer aber als Dev mit XML-Sourcen und fremden
APIs arbeitet, sollte wissen was er tut. Wie die files aussehen sollen ist hinreichend
dokumentiert und mit Beispieldateien ergänzt. Wer damit nicht klarkommt,
dem helfen m.E. auch zusätzliche Fehlermeldungen nicht weiter.

Würde ich das Modul kommerziell für Enduser zum Kauf anbieten, wären sicherlich
weitaus mehr Sicherheitsabfragen, vermutlich auch diverse Wizards und eine
ausführliche Doku dabei. Das Modul hier tut robust was es tun soll und wer
mehr braucht, darf auf dieser Basis gerne aktiv werden, es ist hier ja ein
Developer-Forum. Das ist nicht böse gemeint von mir, ich habe schlicht nicht
die Zeit dafür, jeden Wunsch zu erfüllen.

  1. Sicher das Convert.ToDateTime so immer korrekt arbeitet? Auch in
    jeder Culture? Bin nicht sicher das eine Englische Culture die Deutsche Syntax
    validiert, müsste man schauen wie man das löst.

Wer auf Nummer sicher gehen will, soll alle date-Informationen im ODBC-
Format eintragen, das klappt immer, auch z.B. bei US-Formaten.
D.h. "YYYY-MM-TT". Auch hier wieder: Wer ein entsprechendes Modul zur
Kalenderberechnung in seine Lib integrieren und über diverse Cultures streuen
will, sollte grundsätzlich Erfahrungen mit Datumsformaten und deren richtige
Verwendung mitbringen.

Konnte leider nicht lesen was Du zu meinem Programmierstil geschrieben hast,
möglich das über 10 Jahre Assembler bei mir einen speziellen Einschlag mit
sich gebracht haben. Lesbarkeit und Struktur sind für mich sehr wichtig,
deshalb auch die explizite Hervorhebung von Klassen und Methoden, auch wenn
die "Striche" in den Klassen- und Methoden-Heads für manche seltsam aussehen
mögen.

Robin

U
1.578 Beiträge seit 2009
vor 13 Jahren

... ich habe schlicht nicht die Zeit dafür, jeden Wunsch zu erfüllen.

Das hat mit "Wunsch" nichts zu tun, das ist mindest Voraussetzung. Wenn du dir schon die Zeit genommen hast so etwas zu schreiben, dann solltest du es auch richtig machen 😉
Deine aussage "Das Modul hier tut robust was es tun soll" ist dementsprechend einfach falsch.
Korrekte Behandlung von falsch eingaben gehören nun mal dazu.

und wer mehr braucht, darf auf dieser Basis gerne aktiv werden

Du fängst an und wir schreiben deine Sachen zu ende weil du dafür keine Zeit hast?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CSL,

Das hat mit "Wunsch" nichts zu tun, das ist mindest Voraussetzung.

dem kann ich überhaupt nicht zustimmen. Ich möchte hier keine generelle Diskussion über Exceptionhandling, deshalb sei nur soviel gesagt: Exceptions sollten da behandelt werden, wo sie behandelt werden können. Aber was soll die Bibliothek den tun, wenn die Konfigurationsdateien nicht vorhanden sind oder deren Format nicht stimmt (Achtung: rhetorische Frage)? Es ist also vollkommen korrekt bzw. sogar notwendig, dass (die entsprechenden) Exceptions zum Aufrufer der Bibliothek fliegen. Natürlich wäre schön, wenn das dokumentiert wäre, aber nun ist es ja auch so bekannt. Jedenfalls ist es die Entscheidung von RBA285.

Selbst die Möglichkeit, auf die du anspielst, dass die Konfigurationsdateien im Format der InvariantCulture (erstellt und) eingelesen werden, hätte nicht nur Vorteile. Der Vorteil wäre, dass die beigelegten Konfigurationsdateien auf jedem Rechner unabhängig von den Ländereinstellungen funktionieren würden. Aber die Konfiguration ist doch gerade eingeführt worden, um sprachliche (und damit landesspezifische) Unterschiede berücksichtigen zu können. Da ist es dann aber gerade ein Vorteil, wenn man nicht nur die Namen in der Landessprache eingeben kann, sondern auch die Datumsinformationen im Format des Landes abgeben kann. Wie dem auch sei, es die Entscheidung von RBA285.

Du fängst an und wir schreiben deine Sachen zu ende weil du dafür keine Zeit hast?

Das Anspruchsdenken, dass aus deiner Frage spricht, spricht nicht für dich. Außerdem verkennst du, dass es gerade einer der wichtigsten Vorteile von Open Source ist, dass genau das möglich wird.

Und damit lass es jetzt bitte mal gut sein.

herbivore

M
118 Beiträge seit 2008
vor 13 Jahren

Hallo RBA285,

danke für deine Arbeit und das Veröffentlichen. Darf man deinen Rechner frei benutzen, oder gibt es eine spezielle Lizenz?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Realnub,

siehe Lizenzbedingungen für die Projekte

herbivore

R
RBA285 Themenstarter:in
68 Beiträge seit 2010
vor 13 Jahren

danke für deine Arbeit und das Veröffentlichen. Darf man deinen
Rechner frei benutzen, oder gibt es eine spezielle Lizenz?

Hallo Realnub,

herbivore hat ja schon auf die Lizenzbedingungen hingewiesen, d.h. ja,
Du darfst die Sourcen frei verwenden und ggf. auch ergänzen. Wenn Du noch
irgendein Feature vermisst, gib' mir Bescheid, sofern es meine Zeit zulässt
bau ich das dann noch ein.

Robin

M
6 Beiträge seit 2010
vor 12 Jahren
Eine Anmerkung

Danke vorweg für die guten Anregungen,

und hier noch ein Hinweis, da es ja der Anspruch der Beiträge sehr hoch war und das Projekt hier nicht nur zum Anzeigen von Feiertagen nutzbar ist.

Drei Dinge:
Weihnachten, Silvester, Ostersonntag, die Adventtage und noch Weitere weißt Ihr als Feiertage aus, was sie jedoch nicht sind (siehe z.B. Rechtsspechung). Was spätestens bei der Berechnung von Lohnzuschlägen zu Fehlern führt.

Weiterhin ist noch das Problem mit Weihnachten und Silvester (sicher in von euch in eigenen Projekten beachtet), dass hier gesetzl. freie Zeiten vorgegeben sind. Oftmals nicht bekannt ist, dass an beiden Tagen erst ab 14:00 Uhr frei ist und so bei Schichtberechnungen wiederum Fehler passieren.

Wenn man es nun genau nimmt, kann das alles aber durch Haustarifverträge oder Rahmenvereinbarungen wieder ausgehebelt werden.

Als Anregung daher für die die das Projekt für Schicht-, Arbeitsstunden-, Lohnzuschlagsberechnung verwenden sollten die Feiertags-XML z.B. so erweitert werden:

<?xml version="1.0" encoding="utf-8"?>
<Holidays.Config>
  <Country>
    <CountryCode>DE</CountryCode>
    <Language>DE</Language>
    <Catalog Description="Haustarifvertrag 15.12.2010" ValidFrom="01.01.2011" ValidTo="15.10.2012">
      <Holiday>
        <HolidayID>290</HolidayID>
        <HolidayName>Silvester</HolidayName>
        <HolidayFormula>F:31.12</HolidayFormula>
        <HolidayDuration>1</HolidayDuration>
        <HolidayValidFrom>01.01.1900</HolidayValidFrom>
        <HolidayValidTo>31.12.2099</HolidayValidTo>
        <StateIDList>0</StateIDList>
        <IsOfficalHoliday>False</IsOfficalHoliday>
        <IsCompanyHoliday>True</IsCompanyHoliday>
        <IsFreeFromTime>14:00:00.000</IsFreeFromTime>
        <IsFreeToTime>23:59:59.999</IsFreeToTime>
      </Holiday>
    </Catalog>
  </Country>
</Holidays.Config>

Entsprechend müssten natürlich noch verschiedene Methoden bei der Auswertung eingebaut werden.

Also nochmals Danke für das was hier bisher diskutiert worden ist und das hier nur als Hinweis oder Anregung zur Vervollständigung des Themas.

CU Martin

D
67 Beiträge seit 2006
vor 11 Jahren
tsTicks.TotalDays +1 ?

Hallo,
beim stöbern bin ich auf diese Klasse gestoßen. Nun versuche ich zu verstehen.

Ich habe jetzt eine Frage:
Wenn ich das gleiche Datum subtrahiere kommt 1 raus. Macht das Sinn?


public int GetWorkingDays(DateTime beginDate, DateTime endDate)
        //------------------------------------------------------------------------------------------------------------------------------------
        {
            int daysDiff; // Days gross between begin- and enddate
            int weekDayCount; // Counter for Weekdays (0 = Sunday, 1 = Monday etc., with respect to DayOfWeek Enum)
            int workingDays; // Counter working days
            int correctionIndex; // Index to Weekdayarray for day count correction
            DateTime currentHolidayDate; // Date of current holiday
            int currentDuration; // Duration of current holiday
            TimeSpan tsTicks; // Difference begin- and enddate using ticks 
            int[] aWeekdays = { 0, 0, 0, 0, 0, 0, 0 }; // Array with counter for weekdays of the working days (Index 0 = all Sundays, 1 = all Mondays etc.)
            List<DateTime> checkedDates = new List<DateTime>(); // Array with holidays to ensure, that a holiday date gets considered only one time. 
            // E. g., when 2 holidays have the same date (e. g. fourth advent can be the same day as xmas).
            // Otherwise the working days would get reduced by 2, what is wrong.

            tsTicks = new TimeSpan(endDate.Ticks - beginDate.Ticks);
           [B] daysDiff = (int)(tsTicks.TotalDays); // Days total gross. (AF:(tsTicks.TotalDays + 1) WARUM +1 )[/B]
5.742 Beiträge seit 2007
vor 11 Jahren

Wenn ich das gleiche Datum subtrahiere kommt 1 raus. Macht das Sinn?

IMHO schon - wenn man ersten und letzen Arbeitstag am selben Tag hat, hat man ja genau einen Tag gearbeitet.

N
54 Beiträge seit 2011
vor 11 Jahren

Hallo,

habe den Kalender mal ausprobiert, ohne die XML Feitertagsmatrix und bei mir kommt da etwas komisches raus.

KalenderRechner meinKalender = new KalenderRechner(KalenderRechner.BundesLänder.Bayern);

 tage = Convert.ToInt32(meinKalender.GetArbeitstage("01.08.2012 00:00:00", "01.08.2012 23:59:59");

tage hat den Wert 0.

tage = Convert.ToInt32(meinKalender.GetArbeitstage("01.08.2012 00:00:00", "02.08.2012 23:59:59");

tage hat den Wert 1.

tage = Convert.ToInt32(meinKalender.GetArbeitstage("01.08.2012 00:00:00", "03.08.2012 23:59:59");

tage hat den Wert 3.

Das erscheint mir etwas seltsam da bei der letzte Abfrage denke ich dann tage=2 kommen sollte oder bei den beiden am Anfang tage=1 und tage=2.

mfg

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo NeueWelt,

da in deinem Beispielcode deutsche Klassennamen stehen, scheinst du nicht die aktuelle Version zu verwenden. Das solltest du als erstes tun.

herbivore

N
54 Beiträge seit 2011
vor 11 Jahren

Stimmt, hattest recht.

Habe jetzt auch die Version mit den xml Dateien genommen.

funktioniert einwandfrei.

Super Ding!

Danke

mfg

O
6 Beiträge seit 2013
vor 10 Jahren

Hallo Robin,

ich habe mir gerade dein Kalenderrechner angeschaut (die zweite Deutsche Version), den finde ich total toll, hätte nur eine Frage dazu?
Geht es auch das er die Tage zwischen Anfang und Enddatum inklusive dem Enddatum anzeigt, also wenn ich von 01.01 bis 02.01 eingebe das er dann zwei Tage ausgibt.

Gruß Mirko

16.806 Beiträge seit 2008
vor 10 Jahren

Der Thread-Ersteller war nun 1 Jahr nicht mehr aktiv. Es ist davon auszugehen, dass er diesen Thread nicht (mehr) lesen wird.

Das aktivste DateTime-Projekt, das es in .NET derzeit gibt und die meisten (messbaren) Features hat, ist http://nodatime.org/
Es wird in einigen großen Projekten erfolgreich verwendet.

O
6 Beiträge seit 2013
vor 10 Jahren

Hab es selber hinbekommen, Danke an alle!!!