【问题标题】:How to count working 15 days and get enddate?如何计算工作 15 天并获得结束日期?
【发布时间】:2018-07-23 18:32:34
【问题描述】:

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

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;
}

【问题讨论】:

  • 由于 21 个日历日总是包含 15 个工作日,因此请使用 var endDate = startDate.AddDays(21);
  • 我在哪里输入上面的代码请解释
  • 您的问题含糊不清,您要解决的实际问题是什么?你想知道如何只用一个参数调用你的函数,还是想知道如何只计算工作日?请改进您的问题。

标签: c# asp.net


【解决方案1】:

这里有两种方法。

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

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;
}

GetFixedNumberOfBusinessDays 返回从给定开始到给定天数(您要求的方法)的工作日日期列表。

// Returns a list of the dates of the Business Days from the given start with the given number of days
public static IEnumerable<DateTime> GetFixedNumberOfBusinessDays(DateTime startDate, int numberOfBusinessDays, DayOfWeek[] closedOn) {

    if (numberOfBusinessDays < 0) {
        throw new ArgumentException("numberOfBusinessDays must be zero or positive.");  
    }

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

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

    return businessDays;
}

引入参数DayOfWeek[] closedOn 是因为您不想硬编码一周中的非工作日。

返回类型改为IEnumerable&lt;DateTime&gt;,所以这个方法更通用。如果您只想要天数并且对实际日期不感兴趣,只需在结果上运行 .Count()。如果您想知道结束日期,请致电.Last()

.Net Fiddle 使用示例:

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

【讨论】:

    【解决方案2】:

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

    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;
            }
    

    DateTime endDate = startDate.AddWorkdays(15);
    

    【讨论】:

      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多