myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Kalenderrechner für tatsächliche Arbeitstage
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Kalenderrechner für tatsächliche Arbeitstage

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68


RBA285 ist offline

Kalenderrechner für tatsächliche Arbeitstage

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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:

C#-Code:
meinKalender.AddFeiertag(KalenderRechner.Feiertage.AugsburgerFriedensfest);

Und wieder weg:

C#-Code:
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:

C#-Code:
meinKalender.SamstagIstArbeitstag = true;

Für Sonntage sinngemäß.

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

C#-Code:
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:

C#-Code:
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:

C#-Code:
            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.


Dateianhang:
unknown kalenderrechner.zip (3,40 KB, 1.116 mal heruntergeladen)
13.05.2010 17:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Wenn schon deutsch dann korrigiere mal großes Grinsen
"Sylvester" -> "Silvester"
"MariaHimmelfahrt" -> "MariäHimmelfahrt"
13.05.2010 18:18 Beiträge des Benutzers | zu Buddylist hinzufügen
userid12529
myCSharp.de-Mitglied

Dabei seit: 07.07.2008
Beiträge: 208


userid12529 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CSL:
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...
13.05.2010 18:54 Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
13.05.2010 19:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CSL:
Sonntagsarbeit geht nicht?

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

C#-Code:
meinKalender.SonntagIstArbeitstag = ...

Zitat von CSL:
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:

C#-Code:
public List<Feiertage> GetFeiertagList

Zitat von CSL:
Wenn schon deutsch dann korrigiere mal großes Grinsen
"Sylvester" -> "Silvester"
"MariaHimmelfahrt" -> "MariäHimmelfahrt"

In der Anlage mit den besprochenen Korrekturen. großes Grinsen

Robin

EDIT: Weiter  unten gibt es eine aktuellere Version.


Dateianhang:
unknown Kalenderrechner.zip (3,42 KB, 654 mal heruntergeladen)
13.05.2010 19:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Isaac:
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 Augenzwinkern

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von userid14268 am 14.05.2010 00:04.

13.05.2010 23:54 Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Isaac:
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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von userid14268 am 14.05.2010 00:04.

14.05.2010 00:03 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
14.05.2010 06:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Finde ich eine erstklassige Idee :)
Der vorteil ist dann auch das man dann die Selben Klassen auch für andere Länder verwenden kann :)
14.05.2010 10:03 Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von herbivore:
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-Code:
<?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-Code:
?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:

C#-Code:
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:

C#-Code:
CalendarCalculator calendar = new CalendarCalculator( holidayMatrix );

Und schon kann man rechnen:

C#-Code:
int days = calendar.GetWorkingDays(new DateTime(2010, 3, 31), new DateTime( 2010,5, 3));

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

C#-Code:
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


Dateianhang:
unknown CalendarCalculator.zip (8 KB, 1.196 mal heruntergeladen)
15.05.2010 07:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Klasse Arbeit, gefällt mir smile
15.05.2010 09:54 Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CSL:
Klasse Arbeit, gefällt mir smile

Danke großes Grinsen

Die SAP-Schnittstelle wird dann kostenpflichtig. Augenzwinkern

Robin
15.05.2010 14:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top


mycsharp.de  Moderationshinweis von herbivore (15.05.2010 17:40):

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.

4. 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.

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

6. 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.
15.05.2010 17:10 Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CSL:
4. 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.

5. 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.

Zitat von CSL:
6. 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
15.05.2010 18:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
userid14268
myCSharp.de-Mitglied

Dabei seit: 30.01.2009
Beiträge: 1.578


userid14268 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von RBA285:
... 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.



Zitat:
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?
15.05.2010 20:39 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo CSL,

Zitat:
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.



Zitat:
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
16.05.2010 07:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Mackerlama Mackerlama ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.09.2008
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Thüringen


Mackerlama ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo RBA285,

danke für deine Arbeit und das Veröffentlichen. Darf man deinen Rechner frei benutzen, oder gibt es eine spezielle Lizenz?
16.05.2010 08:03 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Realnub,

siehe  Lizenzbedingungen für die Projekte

herbivore
16.05.2010 08:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
RBA285
myCSharp.de-Mitglied

Dabei seit: 11.04.2010
Beiträge: 68

Themenstarter Thema begonnen von RBA285

RBA285 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Realnub:
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
16.05.2010 09:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
Martin1000 Martin1000 ist männlich
myCSharp.de-Mitglied

Dabei seit: 04.11.2010
Beiträge: 6
Entwicklungsumgebung: VS 2010
Herkunft: SA


Martin1000 ist offline

Eine Anmerkung

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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-Code:
<?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
08.09.2011 07:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 8 Monate.
daniel94ever
myCSharp.de-Mitglied

Dabei seit: 24.11.2006
Beiträge: 67
Entwicklungsumgebung: Visual Studio 2005
Herkunft: Niedersachsen, Nähe Hannover


daniel94ever ist offline

tsTicks.TotalDays +1 ?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
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]
11.05.2012 15:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von daniel94ever:
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.
11.05.2012 23:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
NeueWelt NeueWelt ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.10.2011
Beiträge: 54
Entwicklungsumgebung: Visual Studio C#
Herkunft: Bayern


NeueWelt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

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

C#-Code:
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.

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

tage hat den Wert 1.

C#-Code:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von NeueWelt am 20.07.2012 11:50.

20.07.2012 11:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo NeueWelt,

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

herbivore
21.07.2012 07:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
NeueWelt NeueWelt ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.10.2011
Beiträge: 54
Entwicklungsumgebung: Visual Studio C#
Herkunft: Bayern


NeueWelt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Stimmt, hattest recht.

Habe jetzt auch die Version mit den xml Dateien genommen.

funktioniert einwandfrei.


Super Ding!


Danke
23.07.2012 11:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
okrim
myCSharp.de-Mitglied

Dabei seit: 18.10.2013
Beiträge: 6


okrim ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von okrim am 02.03.2014 15:06.

02.03.2014 13:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.488
Herkunft: BW


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
02.03.2014 13:34 Beiträge des Benutzers | zu Buddylist hinzufügen
okrim
myCSharp.de-Mitglied

Dabei seit: 18.10.2013
Beiträge: 6


okrim ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hab es selber hinbekommen, Danke an alle!!!
02.03.2014 15:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Jahre.
Der letzte Beitrag ist älter als 6 Jahre.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.01.2021 16:43