Autor Beitrag
okrim
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Fr 28.02.14 21:57 
Hallo an alle,

hab mal wieder ein Problem mit dem ich trotz Googlen nicht weiter komme und zwar möchte ich zwischen zwei Datumsangaben die Anzahl der Tage errechnen, aber ohne Samstag und Sonntag, perfekt wäre noch ohne Feiertage (Bayern).
Würde mich total freuen wenn ihr mir helfen konntet.

Gruß Mirko


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Fr 28.02.2014 um 21:12
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 28.02.14 22:25 
Das ist jetzt bestimmt nicht sonderlich performant, aber diese Datumsgeschichten fand ich immer ziemlich unübersichtlich, deswegen traue ich mir das gerade nicht zu, das besser zu bauen:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
    static int WorkdaysBetween(DateTime start, DateTime end, DateTime[] holidays)
    {
      //Zeiten gleichmachen
      start = new DateTime(start.Year, start.Month, start.Day);
      end = new DateTime(end.Year, end.Month, end.Day);


      int result = 0;
      var t = end - start;
      while (start < end)
      {
        if (start.DayOfWeek != DayOfWeek.Saturday && start.DayOfWeek != DayOfWeek.Sunday) //kein Wochenende
        {
          if (holidays.Count(d => d.Day == start.Day && d.Month == start.Month) == 0//kein Feiertag
            result++;
        }
        start = start.AddDays(1);
      }

      return result;
    }


        static  void Main(string[] args)
        {
      var holidays = new DateTime[] {
        new DateTime(20000303)
      };

      var start = DateTime.Now;
      var end = new DateTime(20140308);

      Console.WriteLine(WorkdaysBetween(start, end, holidays));
      Console.ReadLine();
        }


Und bitte mal eine Menge Testfälle drauf loslassen, das ist nur schnell runtergetippt. Im Wesentlich erhöhe ich in einer Schleife immer den Starttag und erhöhe einen Zähler, wenn es kein Wochenende und kein Feiertag ist. Schluss mit der Schleife ist, wenn Starttag und Endtag identisch sind.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Fr 28.02.14 23:08 
Hallo Christian,

danke für deine schnelle Antwort, wie genau kann ich das jetzt in meiner Form testen? Sorry wenn das jetzt eine Blöde Frage ist, aber ich habe erst angefangen mit dem Programmierern.

Hab in meiner TestForm zwei dateTimePicker, ein button und ein label, mit den Consolen Anwendungen kenne ich mich leider überhaupt nicht aus.

Vorweg gleich nochmal ein Danke
Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Fr 28.02.14 23:43 
Hallo,

hab mir mal den Code von Christian "geklaut" und eine WinForm draus gebastelt. Hoffe es hilft weiter!

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
public partial class Form1 : Form
    {
        List<DateTime> feiertage;
        DateTime feiertag;

        public Form1()
        {
            InitializeComponent();
            feiertage = new List<DateTime>();
            feiertag = new DateTime(201411);
            feiertage.Add(feiertag);
            feiertag = new DateTime(201451);
            feiertage.Add(feiertag);
            
        }

        private void btnBerechne_Click(object sender, EventArgs e)
        {
            textBoxBerechneteTage.Text = WorkdaysBetween(dateTimePickerStartDate.Value, dateTimePickerEndDate.Value, feiertage).ToString();
        }

        int WorkdaysBetween(DateTime start, DateTime end, List<DateTime> holidays)
        {
            //Zeiten gleichmachen
            start = new DateTime(start.Year, start.Month, start.Day);
            end = new DateTime(end.Year, end.Month, end.Day);


            int result = 0;
            var t = end - start;
            while (start < end)
            {
                if (start.DayOfWeek != DayOfWeek.Saturday && start.DayOfWeek != DayOfWeek.Sunday) //kein Wochenende
                {
                    if (holidays.Count(d => d.Day == start.Day && d.Month == start.Month) == 0//kein Feiertag
                        result++;
                }
                start = start.AddDays(1);
            }

            return result;
        }

      
    }


Anbei noch die Form.

MfG
Einloggen, um Attachments anzusehen!
_________________
the quiter you become, the more you are able to hear

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 01.03.14 00:23 
Hi Yankyy02,

danke, das klappt ja schon gar nicht so schlecht, nur wenn ich jetzt z.B. Montag den 24. bis Dienstag den 25. Auswähle, dann bekomme ich als Ergebnis eine eins, aber das sind doch dann zwei Arbeitstage, oder habe ich da einen Denkfehler?
Oder wird nur bis zum Enddatum gerechnet, also nicht einschließlich Enddatum, was ich besser finden würde, da ich Urlaubstage damit ausrechnen möchte und da gebe ich ja ein bis wann ich Urlaub gehabt habe.

Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 01.03.14 00:37 
Hallo okrim,

Das liegt an der while - Schleife. Wenn du die while Schleife auf (start <= end) änderst sollte es für dich passen! Allerdings war die Methode ja nur als Denkansatz gedacht wie du es umsetzen könntest den grundsätzlich stimmt es da zb. Montag 00:00 Uhr bis Freitag 00:00 4 Tage sind und Montag 00:00 Uhr bis Freitag 24:00 Uhr 5 Tage sind. Ich hoffe du verstehst was ich meine.

MfG

_________________
the quiter you become, the more you are able to hear

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 01.03.14 00:51 
Hey Cooool,

das klappt ja richtig gut!!!
Ich freu mich so :D :lol: :)

Wie ist das mit den Feiertagen eigentlich, muss ich die unter public Form1() eingeben, oder gibt es da auch eine Möglichkeit, das es die nächsten Jahre passt.
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 01.03.14 00:58 
Nö natürlich nicht daß war nur mal als Beispiel gedacht. Da gibt es viele Möglichkeiten und ich gehe davon aus daß es dir um deine Anwendung mit der Datenbank geht!? Wenn dem so ist könntest du eine Tabelle mit den Feiertagen anlegen um diese dort zu speichern. Du könntest sie aber auch in einer .txt Datei hinterlegen und beim start der Anwendung einlesen.
Direkt im Quellcode würde ich sie nicht hinterlegen.

_________________
the quiter you become, the more you are able to hear

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 01.03.14 01:10 
Ja es geht immer noch um mein Programm wo ich die Stunden im Geschäft schreibe, mir ist heute eingefallen da wenn ich z.B. 3 Wochen Urlaub habe dann müsste ich jeden Tag Urlaub eintragen, jetzt will ich es so machen das eine Abfrage kommt bis wann man Urlaub hat und dann soll es Automatisch gehen das die Urlaubstage eingetragen werden, wenn natürlich ein Feiertag dazwischen ist soll das ja kein Urlaub sein, da dann ja meine Berechnung der Urlaubstage nicht mehr stimmen würde.
Das mit der txt Datei hört sich gut an, mal sehen ob ich das hin bekomme, denn da hab ich mal wieder überhaupt kein Plan, gäbe es kein Google wäre ich total verloren, und gäbe es dieses Forum nicht wäre ich auch noch nicht so weit.

Nochmal tausend Dank an dich und das ganze Forum
Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 01.03.14 01:24 
Anbei noch eine Seite auf der du die Feiertage im XML Format bekommst. Das wäre eine gute alternative zu einer .txt Datei da sich meienr Ansicht nach eine XML Datei leichter verarbeiten läßt.

www.feiertage-xml.de/

_________________
the quiter you become, the more you are able to hear

Für diesen Beitrag haben gedankt: okrim
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Sa 01.03.14 11:05 
Hallo,
ich habe unter www.entwickler-ecke....ewtopic.php?t=112740 eine allgemeine Lösung für Dein Problem.
Allerdings ist es in Delphi geschrieben, da ich von C# keine Ahnung habe.
Vielleicht kannst Du es selbst übersetzen oder findest jemanden, der es tut.

Beste Grüße
Mathematiker

Für diesen Beitrag haben gedankt: Christian S., okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 01.03.14 13:56 
Hallo Mathematiker,

danke schön, hab es mir dein Programm gerade angeschaut es ist wirklich toll, habe auch gleich mal probiert es zu konvertieren in c# , hat aber nicht wirklich geklappt, vielleicht hat ja einer von euch einen Tipp oder kann mir behilflich sein, würde mich sehr freuen.

hallo Yankyy02,

dir auch danke, hab mir das mit der XML Datei allgemein mal angesehen, steig zwar noch nicht so recht durch, aber das ist allgemein gar nicht so schlecht, da kann ich mir noch eine machen wo ich die Grundeinstellungen abspeichern kann.

Grus Mirko
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 01.03.14 15:34 
Hallo okrim,

im myCSharp-Forum hat auch jemand einen Kalenderrechner (in C#) hinterlegt: Kalenderrechner für tatsächliche Arbeitstage. Vielleicht kannst du dich an dem orientieren?

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: So 02.03.14 14:20 
Hallo Th69,

danke für deine Antwort, der ist gar nicht schlecht werde ihn mal ausprobieren.

Gruß Mirko
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Mo 03.03.14 02:11 
Hallo an alle,
die mir hier wieder geholfen haben. Bin euch sehr sehr Dankbar, wenn es euch nicht gäbe dann wäre ich des Öfteren total aufgeschmissen.
Hab das mit der Berechnung der Arbeitstage hinbekommen, klappt auch wunderbar hab den Kalenderrechner genommen den mir Th69 vorgeschlagen hat. Danke Nochmal

Hab allerdings schon gleich wieder ein Problem, dafür habe ich aber ein neues Thema eröffnet, hier der Link falls mir von euch auch nochmal einer helfen will.
www.entwickler-ecke.....php?p=684682#684682

Gruß Mirko