C# 如何计算工作15天并获得结束日期?

C# 如何计算工作15天并获得结束日期?,c#,asp.net,C#,Asp.net,当我的用户入住酒店时,如何计算我的实际工作日?我只想计算工作日,星期六和星期天除外。请检查以下函数的计数工作日,但我在参数中输入了startdate和enddate。 我想只发送startdate,它会自动计算15个工作日,并将enddate返回给我。 //天数 public static double GetBusinessDays(DateTime startD, DateTime endD) { double calcBusinessDays = 1 + ((

当我的用户入住酒店时,如何计算我的实际工作日?我只想计算工作日,星期六和星期天除外。请检查以下函数的计数工作日,但我在参数中输入了startdate和enddate。 我想只发送startdate,它会自动计算15个工作日,并将enddate返回给我。 //天数

public static double GetBusinessDays(DateTime startD, DateTime endD)
{
    double calcBusinessDays =
           1 + ((endD - startD).TotalDays * 5 -
           (startD.DayOfWeek - endD.DayOfWeek) * 2) / 7;

    if (endD.DayOfWeek == DayOfWeek.Saturday) calcBusinessDays--;
    if (startD.DayOfWeek == DayOfWeek.Sunday) calcBusinessDays--;

    return calcBusinessDays;
} 
我想要这样:

public static Datetime GetBusinessDays(DateTime startDate)
{
    Datetime After15WorkingDaysDate;
    return After15WorkingDaysDate;
}
这里有两种方法

其思想是生成范围内的每个日期,确定它是否为工作日,然后将其添加到结果列表中

GetBusinessDaysInRange
返回给定开始日期和结束日期之间的工作日日期列表。结束日期是排他性的,即如果结束日期是一个工作日,它将不属于结果的一部分

// Returns a list of the dates of the Business Days between the given start and end date
public static IEnumerable<DateTime> GetBusinessDaysInRange(DateTime startDate, DateTime endDate, DayOfWeek[] closedOn) {

   if (endDate < startDate) {
        throw new ArgumentException("endDate must be before startDate");    
   }

    var businessDays = new List<DateTime>();
    var date = startDate;

    while (date < endDate) {
        if (!closedOn.Contains(date.DayOfWeek)) {
            businessDays.Add(date);
        }
        date = date.AddDays(1);
    }

    return businessDays;
}
引入参数
DayOfWeek[]closedOn
,因为您不想硬编码一周中非工作日的天数

返回类型更改为
IEnumerable
,因此此方法更通用。如果您只需要天数,而对实际日期不感兴趣,只需对结果运行
.Count()
。如果需要结束日期,请调用
.Last()

使用示例如下:

var closedOn = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday };
var start = new DateTime(2018, 07, 23);
var numberOfDays = 10;

var businessDays = GetFixedNumberOfBusinessDays(end, numberOfDays, closedOn);

int actualNumberOfBusinessDays = businessDays.Count(); // 10    
DateTime endDate = businessDays.Last();                // Friday, August 3, 2018
这里有两种方法

其思想是生成范围内的每个日期,确定它是否为工作日,然后将其添加到结果列表中

GetBusinessDaysInRange
返回给定开始日期和结束日期之间的工作日日期列表。结束日期是排他性的,即如果结束日期是一个工作日,它将不属于结果的一部分

// Returns a list of the dates of the Business Days between the given start and end date
public static IEnumerable<DateTime> GetBusinessDaysInRange(DateTime startDate, DateTime endDate, DayOfWeek[] closedOn) {

   if (endDate < startDate) {
        throw new ArgumentException("endDate must be before startDate");    
   }

    var businessDays = new List<DateTime>();
    var date = startDate;

    while (date < endDate) {
        if (!closedOn.Contains(date.DayOfWeek)) {
            businessDays.Add(date);
        }
        date = date.AddDays(1);
    }

    return businessDays;
}
引入参数
DayOfWeek[]closedOn
,因为您不想硬编码一周中非工作日的天数

返回类型更改为
IEnumerable
,因此此方法更通用。如果您只需要天数,而对实际日期不感兴趣,只需对结果运行
.Count()
。如果需要结束日期,请调用
.Last()

使用示例如下:

var closedOn = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday };
var start = new DateTime(2018, 07, 23);
var numberOfDays = 10;

var businessDays = GetFixedNumberOfBusinessDays(end, numberOfDays, closedOn);

int actualNumberOfBusinessDays = businessDays.Count(); // 10    
DateTime endDate = businessDays.Last();                // Friday, August 3, 2018

它应该是通用方法。您可以在其他位置添加不同的工作日

public static DateTime AddWorkdays(this DateTime originalDate, int workDays)
        {
            DateTime tmpDate = originalDate;
            while (workDays > 0)
            {
                tmpDate = tmpDate.AddDays(1);
                if (tmpDate.DayOfWeek == DayOfWeek.Saturday ||  
                    tmpDate.DayOfWeek == DayOfWeek.Sunday )
                    workDays--;
            }
            return tmpDate;
        }


它应该是通用方法。您可以在其他位置添加不同的工作日

public static DateTime AddWorkdays(this DateTime originalDate, int workDays)
        {
            DateTime tmpDate = originalDate;
            while (workDays > 0)
            {
                tmpDate = tmpDate.AddDays(1);
                if (tmpDate.DayOfWeek == DayOfWeek.Saturday ||  
                    tmpDate.DayOfWeek == DayOfWeek.Sunday )
                    workDays--;
            }
            return tmpDate;
        }


由于21个日历日总是包含15个工作日,只需使用
var endDate=startDate.AddDays(21)在我输入上述代码的地方请解释您的问题不明确,您试图解决的实际问题是什么?您想知道如何只使用一个参数调用函数,还是只计算工作日?请改进您的问题。因为21个日历日总是包含15个工作日,所以只需使用
var endDate=startDate.AddDays(21)在我输入上述代码的地方请解释您的问题不明确,您试图解决的实际问题是什么?您想知道如何只使用一个参数调用函数,还是只计算工作日?请改进你的问题。