Autor |
Beitrag |
okrim
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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 Christian S.: Topic aus WinForms verschoben am Fr 28.02.2014 um 21:12
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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:
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) { 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) { if (holidays.Count(d => d.Day == start.Day && d.Month == start.Month) == 0) result++; } start = start.AddDays(1); }
return result; }
static void Main(string[] args) { var holidays = new DateTime[] { new DateTime(2000, 03, 03) };
var start = DateTime.Now; var end = new DateTime(2014, 03, 08);
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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: Fr 28.02.14 23:43
Hallo,
hab mir mal den Code von Christian "geklaut" und eine WinForm draus gebastelt. Hoffe es hilft weiter!
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(2014, 1, 1); feiertage.Add(feiertag); feiertag = new DateTime(2014, 5, 1); 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) { 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) { if (holidays.Count(d => d.Day == start.Day && d.Month == start.Month) == 0) 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Sa 01.03.14 00:51
Hey Cooool,
das klappt ja richtig gut!!!
Ich freu mich so
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
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: 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
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: 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
|
|