如何根据在c#中花费的DateTime和Days来计算经过时间

时间:2013-02-20 15:16:38

标签: c# datetime weekday

我想知道是否存在任何允许将日期与日期时间相加而不考虑复活节,圣诞节,星期六等“无工作日”的库/方法。

我知道存在方法DateTime.Add,但这并不考虑“非工作日”。

非常感谢!

4 个答案:

答案 0 :(得分:3)

您可以将TimeSpan结构用于时间间隔。以下是另一个stackoverflow线程的示例:

Calculate the number of business days between two dates?

MSDN Documentation for TimeSpan

答案 1 :(得分:0)

不,你必须定义自己的非工作日并建立自己的功能。

答案 2 :(得分:0)

有一个DateTime方法可以告诉你星期几,所以你可以检查星期六/星期日,但其余的由你决定。如果您打算在Office中使用它,那里可以使用一些dll。否则你可能想找到一个可以为你计算出来的开源项目(其中有很多)。

DateTime.Now.DayOfWeek

它将特定于区域,因此如果您计划在多个国家/地区使用您的代码,则需要考虑这些问题。此外,在美国,不同的州也有不同的假期。

答案 3 :(得分:0)

我假设您要查找给定开始日期和工作天数的结束日期?

如果是这样,以下代码可能就是您想要的。它假设您拥有所支持的最长时间范围内的所有假期列表。根据您的要求,未来可能需要几年时间!

此代码采用开始日期和工作日数(以及假期列表)并返回结束日期。

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

这两个实现都会受到访问每个日期的影响。这可能不是问题,但如果日期范围很大,则可能太慢。