36 Stimmen

Hinzufügen von Tagen zu einem Datum, aber Ausschluss von Wochenenden

Wie kann ich zu einem Datum eine Anzahl von Tagen hinzufügen, aber die Wochenenden ausschließen? Wenn ich zum Beispiel den 12.11.2008 (Mittwoch) eingebe und fünf addiere, ergibt das den 19.11.2008 (Mittwoch) und nicht den 17.11.2008 (Montag).

Ich kann mir eine einfache Lösung vorstellen, wie das Durchlaufen einer Schleife für jeden hinzuzufügenden Tag und das Überprüfen, ob es ein Wochenende ist, aber ich würde gerne sehen, ob es etwas Eleganteres gibt. Ich würde auch in jeder F#-Lösung interessiert sein.

0 Stimmen

Werden Sie eine kleine Anzahl von Tagen oder Millionen von Tagen hinzufügen?

10 Stimmen

Ich will Ihnen nur sagen: Sobald Sie ihnen sagen, dass es kein Problem ist, die Wochenenden auszuschließen, werden sie auch Urlaub machen wollen. Denken Sie darüber nach, bevor Sie etwas einführen.

0 Stimmen

Es gibt eine Bibliothek auf NuGet namens TimePeriodLibrary.NET von Jani Giannoudis, die eine enorme Menge an Funktionalität für diese Art von Berechnungen bietet. Wenn sie später auch Feiertage haben wollen, wird es einfach sein.

29voto

Simon Punkte 32146

Mit Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

var dateTime = DateTime.Now.AddBusinessDays(4);

9voto

LeppyR64 Punkte 5010
public DateTime AddBusinessDays(DateTime dt, int nDays)
{
    int weeks = nDays / 5;
    nDays %= 5;
    while(dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
        dt = dt.AddDays(1);

    while (nDays-- > 0)
    {
        dt = dt.AddDays(1);
        if (dt.DayOfWeek == DayOfWeek.Saturday)
            dt = dt.AddDays(2);
    }
    return dt.AddDays(weeks*7);
}

7voto

tocqueville Punkte 4664

Ohne den Algorithmus zu sehr zu verkomplizieren, könnten Sie einfach eine Erweiterungsmethode wie diese erstellen:

public static DateTime AddWorkingDays(this DateTime date, int daysToAdd)
{
    while (daysToAdd > 0)
    {
        date = date.AddDays(1);

        if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
        {
            daysToAdd -= 1;
        }
    }

    return date;
}

7voto

Ogglas Punkte 48648

Ich würde diese Erweiterung verwenden und daran denken, dass es sich um eine Erweiterungsmethode handelt, die in eine statische Klasse eingefügt werden muss.

Verwendung:

var dateTime = DateTime.Now.AddBusinessDays(5);

Code:

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime AddBusinessDays(this DateTime current, int days)
        {
            var sign = Math.Sign(days);
            var unsignedDays = Math.Abs(days);
            for (var i = 0; i < unsignedDays; i++)
            {
                do
                {
                    current = current.AddDays(sign);
                } while (current.DayOfWeek == DayOfWeek.Saturday ||
                         current.DayOfWeek == DayOfWeek.Sunday);
            }
            return current;
        }
    }
}

Source :

https://github.com/FluentDateTime/FluentDateTime/blob/master/src/FluentDateTime/DateTime/DateTimeExtensions.cs

6voto

Arjen Punkte 270

Ich habe eine Erweiterung erstellt, die es Ihnen ermöglicht, Arbeitstage zu addieren oder zu subtrahieren. Verwenden Sie zum Subtrahieren eine negative Zahl von businessDays. Es scheint in allen Fällen zu funktionieren.

namespace Extensions.DateTime
{
    public static class BusinessDays
    {
        public static System.DateTime AddBusinessDays(this System.DateTime source, int businessDays)
        {
            var dayOfWeek = businessDays < 0
                                ? ((int)source.DayOfWeek - 12) % 7
                                : ((int)source.DayOfWeek + 6) % 7;

            switch (dayOfWeek)
            {
                case 6:
                    businessDays--;
                    break;
                case -6:
                    businessDays++;
                    break;
            }

            return source.AddDays(businessDays + ((businessDays + dayOfWeek) / 5) * 2);
        }
    }
}

Ejemplo:

using System;
using System.Windows.Forms;
using Extensions.DateTime;

namespace AddBusinessDaysTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = DateTime.Now.AddBusinessDays(5).ToString();
            label2.Text = DateTime.Now.AddBusinessDays(-36).ToString();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X