Wenn Sie einen Urlaub nicht berücksichtigen müssen, würde ich vorschlagen, Sie so etwas tun:
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd/5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
Es ist ineffizient, aber leicht zu verstehen. Für eine effiziente Version würden Sie die Anzahl der kompletten Wochen berechnen, die Sie hinzufügen möchten, aber dann ein Mapping von jedem "aktuellen Wochentag" und "verbleibenden Arbeitstagen" bis "Anzahl der tatsächlichen Tage bis" hinzufügen". Dann können Sie einfach die Gesamtzahl der hinzuzufügenden Tage berechnen und es in einem Anruf erledigen.
EDIT: In Bezug auf das Niveau der Ineffizienz ... es ist wirklich nicht sehr schlecht. Es werden nur manuelle "is this a weekend" Checks für bis zu 4 Tage durchgeführt, was nicht zu schlecht ist. Insbesondere ist es trotz Igor (aktuelle zum Zeitpunkt der Buchung) Ansprüche, es ist schneller als sein Ansatz, fehlerhafte Benchmarks;)
Beachten Sie, dass es möglicherweise noch nicht negative Eingaben verarbeiten - ich habe nicht überprüft.
Einer der Gründe für den Ansatz, den ich verwende, ist, dass er weder auf mich noch auf den Codeleser angewiesen ist, wenn er weiß, was die Werte in der DayOfWeek
enum sind. Es ist mir egal, ob es 0-6, 1-7, Montag-Sonntag, Samstag-Freitag ... oder auch wenn es völlig bizarre Werte gibt. Ich vergleiche nur für Gleichheit, was den Code "offensichtlich korrekt" macht.
Jon, wäre es effizienter sein, verwenden 'workingDaysToAdd = workingDaysToAdd% 5; Datum = Datum.AddDays (workingDaysToAdd); if (date.DayOfWeek == DayOfWeek.Samstag) date.AddDays (2); if (date.DayOfWeek == DayOfWeek.Sunday) date.AddDays (1); 'und nicht das Schleifenkonstrukt? Nur neugierig. – Lazarus
Ich habe es getestet und es funktioniert genau das, was ich brauche. Hast du es spontan gemacht? in weniger als 5 Minuten, seit ich es gepostet habe .. Mann, das ist ziemlich toll .. aber ich würde mehr effiziente Antworten begrüßen .. danke btw .. – CSharpNoob
Ich würde nicht sagen, es ist ineffizient, aber alle Dinge sind relativ. Die Antwort ist wochenlang gültig, also wird die Schleife höchstens 6 mal durchlaufen (max 4 für workingDays% 5, max 2 für Wochenendtage). Kein großer Erfolg. –