我想知道是否存在任何允许将天数与日期时间相加而不考虑复活节、圣诞节、星期六等“无工作日”的库/方法。
我知道存在 DateTime.Add 方法,但这没有考虑“非工作日”。
非常感谢!
不,您必须定义自己的非工作日并构建自己的功能。
有一个 DateTime 方法可以告诉你星期几,所以你可以检查周六/周日,但其余的取决于你。如果你打算将它与 Office 一起使用,那里有一些可以使用的 dll。否则,您可能希望找到一个可以为您计算出来的开源项目(其中有很多)。
DateTime.Now.DayOfWeek
这将是非常特定于地区的,因此如果您计划在多个国家/地区使用您的代码,则需要考虑。此外,在美国,不同的州也有不同的假期。
我假设您想在给定开始日期和需要多少工作日的情况下找到某事的结束日期?
如果是这样,下面的代码可能就是你想要的。它假定您有一个您支持的最大时间范围内的所有假期的列表。这可能是未来几年,具体取决于您的要求!
此代码获取开始日期和工作日数(以及假期列表)并返回结束日期。
public static DateTime AddWorkingDays(DateTime start, int workingDays, IEnumerable<DateTime> holidays)
{
var dict = new HashSet<DateTime>(holidays);
DateTime date;
for (date = start; workingDays > 0; date = date.AddDays(1))
{
if (!dict.Contains(date))
{
--workingDays;
}
}
return date;
}
另一种实现假设您有一个谓词可以调用以确定一天是否为假期:
public static DateTime AddWorkingDays(DateTime start, int workingDays, Predicate<DateTime> isHoliday)
{
DateTime date;
for (date = start; workingDays > 0; date = date.AddDays(1))
{
if (!isHoliday(date))
{
--workingDays;
}
}
return date;
}
这两种实现都受到访问每个日期的影响。这可能不是问题,但如果日期范围很大,它可能会太慢。