【发布时间】:2017-12-31 07:22:30
【问题描述】:
我正在处理请假申请。我需要获取排除的日期并将其转换为 dateTime 数组。
我使用以下方法部分实现了这一点。我创建了一个 Helper 文件夹,然后将以下类添加到该文件夹中:
namespace eLeave.Helpers
{
public class BusinessDaysCalculator
{
public int Calculate(DateTime startDate, DateTime endDate, DateTime[] holidays)
{
startDate = FixStartDate(startDate);
endDate = FixEndDate(endDate.Date);
if (startDate > endDate)
return 0;
else
return CalculateDifference(startDate, endDate, holidays);
}
private int CalculateDifference(DateTime startDate, DateTime endDate, DateTime[] holidays)
{
int difference = (int)(endDate - startDate).TotalDays;
int weeks = difference / 7;
if (endDate.DayOfWeek < startDate.DayOfWeek) weeks++;
difference -= weeks * 2;
difference -= HolidayCount(startDate, endDate, holidays);
return difference + 1;
}
private int HolidayCount(DateTime startDate, DateTime endDate, DateTime[] holidays)
{
int holidayCount = 0;
foreach (DateTime holiday in holidays)
{
if (HolidayInRange(startDate, endDate, holiday))
holidayCount++;
}
return holidayCount;
}
private DateTime FixStartDate(DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Sunday)
date = date.AddDays(1);
else if (date.DayOfWeek == DayOfWeek.Saturday)
date = date.AddDays(2);
return date.Date;
}
private bool HolidayInRange(DateTime startDate, DateTime endDate, DateTime holiday)
{
return (holiday >= startDate
&& holiday <= endDate
&& holiday.DayOfWeek != DayOfWeek.Saturday
&& holiday.DayOfWeek != DayOfWeek.Sunday);
}
private DateTime FixEndDate(DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Sunday)
date = date.AddDays(-2);
else if (date.DayOfWeek == DayOfWeek.Saturday)
date = date.AddDays(-1);
return date.Date;
}
}
}
我像下面这样实例化了这个类,并将excludedDate 传递给它,如下所示:
// Get the Excluded dates
var excludedDates = _context.ExcludedDate.Where(d=>d.ExcludedDates >= StartDate).Where(d=>d.ExcludedDates <= EndDate).ToArray();
BusinessDaysCalculator calc = new BusinessDaysCalculator();
int days = calc.Calculate(StartDate, EndDate, excludedDates);
该实现本来可以工作,但出现错误,但尝试使用下面的 holidays DateTime 数组时
DateTime[] holidays = new DateTime[3];
holidays[0] = new DateTime(2017, 08, 15);
holidays[1] = new DateTime(2017, 09, 1);
我在上面的 holiday 数组中得到了排除日期的休假天数
我需要获取 excludeDates 的值并将其与我的班级一起使用以使其工作。
我在这里遇到的错误如下:
Error 1 The best overloaded method match for 'eLeave.Helpers.BusinessDaysCalculator.Calculate(System.DateTime, System.DateTime, System.DateTime[])' has some invalid arguments C:\Apps\WebApplications\eLeave\eLeave\eLeave\Controllers\RequestController.cs 100 32 eLeave
Error 2 Argument 3: cannot convert from 'eLeave.Models.ExcludedDate[]' to 'System.DateTime[]' C:\Apps\WebApplications\eLeave\eLeave\eLeave\Controllers\RequestController.cs 100 67 eLeave
排除日期型号如下:
public class ExcludedDate
{
public byte Id { get; set; }
public DateTime? ExcludedDates { get; set; }
}
【问题讨论】:
-
不清楚您的要求。使用
.ToArray()确实会将其转换为数组 -
@StephenMuecke:我已将问题编辑得更具体。
-
但它已经是
DateTime[]- 这就是.ToArray()所做的 -
@StephenMuecke 我将这些值传递给了以下函数 BusinessDaysCalculator calc = new BusinessDaysCalculator(); 中的参数。 int days = calc.Calculate(StartDate, EndDate, excludeDates);我遇到了错误...我将不得不更新我的问题以包括我的助手类,以便您有更多的理解。
-
@StephenMuecke 我已经编辑了问题以包含我使用的类
标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-3 entity-framework-4 entity-framework-6