我想知道是否存在任何库/方法,可以将天数与日期时间相加,而不考虑复活节、圣诞节、周六等"无工作日"。
我知道存在DateTime方法。添加,但这没有考虑"非工作日"。
非常感谢!
您可以将TimeSpan结构用于时间间隔。以下是另一个stackoverflow线程的示例:
计算两个日期之间的工作日数?
TimeSpan 的MSDN文档
不,您必须定义自己的非工作日并构建自己的函数。
有一个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;
}
这两种实现都会受到每次访问的影响。这可能不是问题,但如果日期范围很大,可能会太慢。