添加天数到日期但不包括周末

Bob*_*Bob 25 c# f# date

给定一个日期我如何添加一些天数,但不包括周末.例如,鉴于11/12/2008(星期三),并且将在2008年11月19日(星期三)而不是11/17/2008(星期一)增加5.

我可以想到一个简单的解决方案,比如循环每天添加和检查是否是一个周末,但我想看看是否有更优雅的东西.我也对任何F#解决方案感兴趣.

Sim*_*mon 20

使用Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

var dateTime = DateTime.Now.AddBusinessDays(4);
Run Code Online (Sandbox Code Playgroud)

  • 可以在这里找到更好的O(1)解决方案:http://stackoverflow.com/questions/1044688 (4认同)

Lep*_*R64 6

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);
}
Run Code Online (Sandbox Code Playgroud)


Arj*_*jen 6

我创建了一个扩展,允许您添加或减少工作日。使用负数的工作日进行减去。它似乎在所有情况下都有效。

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案准确地假设,如果源日期是周末,则加或减 1 将允许经过一个工作日,从而分别得到星期二或星期四。加零将返回星期一。非常高效,不需要任何迭代/循环。谢谢! (2认同)

Pau*_*ier 5

int daysToAdd = weekDaysToAdd + ((weekDaysToAdd / 5) * 2) + (((origDate.DOW + (weekDaysToAdd % 5)) >= 5) ? 2 : 0);
Run Code Online (Sandbox Code Playgroud)

以机智; 要添加的“实际”天数是您指定的工作日数,加上该总数中的完整周数(因此为 weekDaysToAdd / 5)乘以 2(周末两天);如果一周中的原始日期加上一周“内”添加的工作日数(因此 weekDaysToAdd mod 5)大于或等于 5(即是周末日),则加上两天的潜在偏移量。

注意:这假设 0 = 星期一,2 = 星期二,... 6 = 星期日。还; 这不适用于负的工作日间隔。


toc*_*lle 5

在不使算法过于复杂的情况下,您可以创建一个扩展方法,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)


Ogg*_*las 5

我会使用这个扩展,记住因为它是一个将它放在静态类中的扩展方法。

用法:

var dateTime = DateTime.Now.AddBusinessDays(5);
Run Code Online (Sandbox Code Playgroud)

代码:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:

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

  • 可惜你没有链接到 FluentDateTime 库,而不是复制粘贴代码(https://github.com/FluentDateTime/FluentDateTime/blob/master/FluentDateTime/DateTime/DateTimeExtensions.cs)。给原开发者一些信用! (7认同)