Laden...

Ersten Werktag im Monat ermitteln

Erstellt von merlin.AT vor 9 Jahren Letzter Beitrag vor einem Jahr 5.047 Views
M
merlin.AT Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren
Ersten Werktag im Monat ermitteln

Hallo

Ich muss den Leuten in der Firma auf dem Zeiterfassungsterminal den ersten Werktag im Monat speziell "hervorheben".
Die Sondertage (Feiertage, Betriebsurlaube, ...) habe ich bereits in einem Array bereit.

Hat das schon mal wer gemacht oder kann mir da helfen? Ich steh da etwas daneben. 😦

Danke, Thomas

P
1.090 Beiträge seit 2011
vor 9 Jahren

Google: c# First Working Day of Month

  1. Treffer: Business days calculations in C#

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

S
93 Beiträge seit 2008
vor 9 Jahren
  1. Wochentag des ersten des Monats ermitteln
  2. Wenn SA SO 1 oder 2 Tage dazu addieren
  3. Prüfen ob Feiertag
  4. wenn Feuertag dann solange 1 dazu bis kein Feiertag dann wieder Wochentag ermitteln und bei 2. Weitermachen
  5. sonst: 1. Arbeitstag gefunden

mist, war zu langsam 😃

476 Beiträge seit 2004
vor 9 Jahren

Hallo zusammen,

euch ist schon bewusst dass es zwischen Werktag und Arbeitstag einen Unterschied gibt?
Werktag - Wikipedia

Wenn merlin.AT wirklich Werktage ermitteln wollte sind beide Lösungen falsch 😮)

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

M
merlin.AT Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren

Hallo

Für mich sind Werk-/Arbeitstage Montag bis Freitag ohne Sondertage.

Danke für eure Hilfe, hab durch euch eine Lösung gefunden hoffe ich.

Danke, Thomas

Hinweis von herbivore vor 9 Jahren

In Deutschland gelten nach § 3 Abs. 2 Bundesurlaubsgesetz (BUrlG) allerdings als Werktag "alle Kalendertage, die nicht Sonn- oder gesetzliche Feiertage sind", also auch Samstage (sofern sie keine gesetzliche Feiertage sind). Man sollte immer explizit dazu sagen, wenn etwas anders gemeint ist.

S
40 Beiträge seit 2022
vor einem Jahr

Servus zsm, da ich aktuell ebenso mit einem ähnlichen Beispiel beschäftigt wird, möchte ich gerne das Thema nochmal aufgreifen und bei meinem Beispiel um Ratschläge, verbesserungen usw bitten. bei mir geht es nicht um den 1. aber vom Prinzip her müsste es gleich sein und zu diesem Tread passen.

Danke im Voraus für eure Antworten


class BuisinessDay
    {
        public Dictionary<DateTime, string> holidaysDict = AddHolidays();

        static Dictionary<DateTime, string> AddHolidays()
        {
            Dictionary<DateTime, string> newDict = new Dictionary<DateTime, string>();
            newDict.Add(DateTime.Parse("2022.1.1"), "Neujahr");
            newDict.Add(DateTime.Parse("2022.4.15"), "Karfreitag");
            newDict.Add(DateTime.Parse("2022.4.17"), "Ostern");
            newDict.Add(DateTime.Parse("2022.4.18"), "Ostermontag");
            newDict.Add(DateTime.Parse("2022.5.1"), "Tag der Arbeit");
            newDict.Add(DateTime.Parse("2022.5.26"), "Christi Himmelfahrt");
            newDict.Add(DateTime.Parse("2022.6.6"), "Pfingstmontag");
            newDict.Add(DateTime.Parse("2022.10.3"), "Tag der Deutschen Einheit");
            newDict.Add(DateTime.Parse("2022.12.25"), "Weihnachten");
            newDict.Add(DateTime.Parse("2022.12.26"), "2.Weihnachtsfeiertag");

            return newDict;
        }

        static bool IsWeekend(DateTime date)
        {
            if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
                return true;

            return false;
        }

        static bool IsHoliday(DateTime time, Dictionary<DateTime, string> holidays)
        {
            foreach (KeyValuePair<DateTime, string> holiday in holidays)
            {
                if (time == holiday.Key)
                    return true;
            }

            return false;
        }

        public DateTime NextBuisinessDay(DateTime time, Dictionary<DateTime, string> holidays)
        {
            // ist es so richtig, dass eine DateTime Variable so initialisiert wird?
            DateTime newDate = default(DateTime);

            if (IsWeekend(time) || IsHoliday(time, holidays))
            {
                for (int i = 0; i <= 6; i++)
                {
                    if (IsWeekend(time.AddDays(i)) == false && IsHoliday(time.AddDays(i), holidays) == false)
                    {
                        newDate = time.AddDays(i);
                        Console.WriteLine($"myDate: {time.ToString("F")}\t newDate: {newDate.ToString("F")}");
                        return newDate;
                    }
                }
            }
            return time;
        }

        public void OutPut()
        {
            Console.WriteLine(NextBuisinessDay(DateTime.Parse("2022.4.15"), holidaysDict));
        }
    }


D
152 Beiträge seit 2013
vor einem Jahr

Mit default erfolgt eine Initialisierung mit dem Standardwert des jeweiligen Typ.
In den Fall ist aber keine Initialisierung notwendig, diese oder eine Zuweisung ist nur vor dem ersten Lesezugriff notwendig.
Mit welchen Wert eine Initialisierung ist eher fachlicher Natur und nicht technischer Natur.

Als Vorschlag was kürzer ist (ungetestet):


    // public DateTime NextBuisinessDay(DateTime date, Dictionary<DateTime, string> holidays)
    public DateOnly NextBuisinessDay(DateOnly date, Dictionary<DateOnly, string> holidays)
    {
        while (IsWeekend(date) || IsHoliday(date, holidays))
        {
            date = date.AddDays(1);
        }

        return date;
    }

S
40 Beiträge seit 2022
vor einem Jahr

@david.m

danke dir für deine Antwort. Haben wir wieder etwas dazu gelernt.

ich weise lokalen Variablen gerne den min Wert zu, weil ich sonst nur wieder eine Fehlermeldung bekomme und bei DateTime hab ich leider nichts gefunden was der min Wert ist. Darum meine Frage.