C#: Hinzufügen Werktagen von einem cetain Datum
Ich habe Mühe, dies zu tun. Ich bin momentan dabei, eine Methode, die add Werktage zu einem bestimmten Datum.
zum Beispiel möchte ich hinzufügen-3 Werktage, sept 15, 2010 (Mittwoch) - Methode liefert sept 20 (Montag nächste Woche). es missachtet Samstag und Sonntag, weil seine nicht-Arbeitstag..
So etwas in C#:
DateTime AddWorkingDays(DateTime specificDate, int workingDaysToAdd)
{
return specificDate + (workingDaysToAdd - (all saturdays and sundays))
}
Halte ich nicht für Besondere Feiertage, die auf den Berechnungen, ich habe gerade buchstäblich hinzufügen möchten Tage außer Samstag und Sonntag.. vielen Dank im Voraus! =)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht brauchen, zu prüfen, Ferien, würde ich vorschlagen, Sie tun so etwas wie dieses:
Es ist ineffizient, aber einfach zu verstehen. Für eine effiziente version, Sie würden arbeiten aus der Anzahl der vollständigen Wochen, um hinzuzufügen, wie vor, aber habe dann eine Zuordnung von jedem "aktuelle Wochentag" und "Werktagen Links hinzufügen" zu "Anzahl der tatsächlichen Tage hinzufügen". Dann könnten Sie einfach work out die Gesamtzahl der Tage an, die Sie hinzufügen möchten, und tun es in einem Aufruf.
EDIT: In Bezug auf den Grad der Ineffizienz... es ist wirklich nicht sehr schlecht. Es werden nur manuelle "ist das ein Wochenende" Prüfungen für bis zu 4 Tage, das ist nicht zu schlecht. Insbesondere, trotz Igors (aktuell zum Zeitpunkt der Veröffentlichung) behauptet, es ist eher schneller als sein Ansatz, fehlerhafte benchmarks trotz 😉
Beachten Sie, dass es nicht mit negativen Eingänge noch - ich habe noch nicht überprüft.
Einer der Gründe, warum der Ansatz, den ich verwende, ist, dass es sich nicht auf entweder mir oder dem code-Leser wissen, was die Werte in der
DayOfWeek
enum sind. Ich glaube nicht, egal, ob es 0-6, 1-7, Montag-Sonntag, Samstag-Freitag... oder auch wenn es völlig bizarre Werte. Ich habe nur Vergleiche auf Gleichheit, das macht den code besser "offensichtlich richtig".workingDaysToAdd = workingDaysToAdd % 5; date = date.AddDays(workingDaysToAdd); if (date.DayOfWeek == DayOfWeek.Saturday) date.AddDays(2); if (date.DayOfWeek == DayOfWeek.Sunday) date.AddDays(1);
anstatt das loop-Konstrukt? Einfach nur neugierig.if ((int)specificDate.DayOfWeek + workingdaysToAdd > 5) specificDate = specificDate.AddDays(2);
ersetzt die Schleife.@i==0 (date = Friday, date.AddDays(1) = Saturday, !IsWeekday, date.AddDays(1) = Sunday), @i==1 (date = Sunday, date.AddDays(1) = Monday, IsWeekday), @i==2 (date = Monday, date.AddDays(1) = Tuesday), return date = Tuesday
Was bin ich?Ganz cool (wie ich finde) ist, die in eine extension-Methode, wie:
damit Ihre endgültige code wird wie folgt Aussehen:
Hier ist, was Sie brauchen :
Aktualisiert :
HINZUGEFÜGT:
Ist eine alte post, aber jemand könnte daran interessiert sein, eine Erweiterung, die Griffe auch negative Tage. (Ich habe Sie überarbeitet @Jon Antwort)
Dies scheint mir der sauberste Weg: