Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何计算两个日期之间的工作日差异?_C#_Datetime_Timespan - Fatal编程技术网

在C#中,如何计算两个日期之间的工作日差异?

在C#中,如何计算两个日期之间的工作日差异?,c#,datetime,timespan,C#,Datetime,Timespan,我知道我可以使用以下公式计算两个日期之间的天数差: private int DaysFromStart(DateTime date, DateTime startDate) { var days = date.Subtract(startDate); return (int)days.TotalDays; } 但是现在我想通过得到两个日期之间的差异,只包括工作日。例如,如果开始日期是星期五,要检查的日期是下一个星期一,那么返回值将是1。考虑下面的代码片段 int allDay

我知道我可以使用以下公式计算两个日期之间的天数差:

private int DaysFromStart(DateTime date, DateTime startDate)
{
    var days =  date.Subtract(startDate);
    return (int)days.TotalDays;
}

但是现在我想通过得到两个日期之间的差异,只包括工作日。例如,如果开始日期是星期五,要检查的日期是下一个星期一,那么返回值将是1。

考虑下面的代码片段

int allDays = (int)date.Subtract(startDate).TotalDays;
int weekDays = Enumerable
                .Range(1, allDays)
                .Select(day => startDate.AddDays(day))
                .Count(day => day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday);

祝你好运

这将为您提供剩余的天数(不包括周日和周六)。变量
start
end
表示开始和结束日期:

int DaysLeft = 0;
for (int i = 1;i <= (int)end.Subtract(start).TotalDays;i++)
{
    DayOfWeek day = start.AddDays(i).DayOfWeek;
    DaysLeft = (day == DayOfWeek.Sunday) || (day == DayOfWeek.Saturday)?DaysLeft:DaysLeft + 1;
}
int DaysLeft=0;

对于(int i=1;i我使用扩展方法返回一个时间跨度内的工作日数,甚至返回两个日期之间的天数的完整列表,然后可以对IEnumerable运行lambda表达式以获得所需内容。下面是静态类的一个非常基本的示例:

public static class TimeSpanextensions
{
    public static IEnumerable<DateTime> GetDays(this DateTime start, DateTime end, bool returnWeekDays = false)
    {
        List<DateTime> daysInSpan = new List<DateTime>();
        //change following line to accomodate date format if needed
        TimeSpan ts = start.Date - end.Date;

        if(start < end)
        {
            DateTime _this = start;

            while (_this < end) 
            {
                _this = start.AddDays(1);
                daysInSpan.Add(_this);
            }
        }

        if(start > end)
        {
            DateTime _this = start;
            while(_this > end)
            {
                _this = _this.AddDays(-1);
                daysInSpan.Add(_this);
            }
        }

        if(returnWeekDays)
        {
            return daysInSpan.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday);
        }

        return daysInSpan;
    }
这是处理此问题的不同方法。要扩展此方法,只需创建一个静态方法,将其作为参数。例如:

List<DateTime> weekDaysOnly = StartsDate.GetDays(endDate).ToList();
//then once again do your business day lambda expression here to leave your list with weekdays only. Hope this helps.
List weekDaysOnly=StartsDate.GetDays(endDate.ToList();
//然后再一次在这里做你的工作日lambda表达式,只在工作日留下你的列表。希望这对你有所帮助。

可能有用:
周五-周一
=>
1
,那么周五-周六
周五-周日
的结果是什么?更新的答案可能重复。请重试。
   int count = Start < EndDate ? 1 : -1;
   DateTime newDate = StartDate;
   List<DateTime> allDaysList = new List<DateTime();

   while(newDate != EndDate)
   {

       newDate = newDate.AddDays(count); //will eithr add or subtract a day
       allDays.Add(newDate);           
   }


   //now return either only weekdays days
   allDays = allDays.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday);
 int workDays =  allDays.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday).Count();
List<DateTime> weekDaysOnly = StartsDate.GetDays(endDate).ToList();
//then once again do your business day lambda expression here to leave your list with weekdays only. Hope this helps.