如何计算从今天起的8个工作日?

时间:2010-04-21 09:45:11

标签: c# asp.net

我有一个场景,我希望从今天起算的8个工作日内查找日期。假设今天的日期是04/21/10。现在我想显示日期是04/09 / 10.Weekends应该被排除在外。

例如。 如果今天的日期是04/21/10

减去周末: 星期六 - 04/10/10,04/17/10 周日-04/11 / 10,04 / 18/10

输出结果是04/09/10。

我想用C#做这件事。

任何帮助或建议都会有所帮助。

谢谢, 萨米特

7 个答案:

答案 0 :(得分:4)

显然有很多的方法可以做到这一点,但也许有一些有趣的发电机。我使用了扩展方法,但使用了YMMV。因此,确定您是否需要使您的代码具有文化意识(或根据您的需要,您需要的任何描述者)等等

public static class DateTimeExtensions
{
    public static IEnumerable<DateTime> Forwards(this DateTime dateTime)
    {
        return dateTime.Forwards(TimeSpan.FromDays(1));
    }

    public static IEnumerable<DateTime> Forwards(this DateTime dateTime, TimeSpan span)
    {
        while (true)
        {
            yield return dateTime += span;
        }
    }

    public static IEnumerable<DateTime> Backwards(this DateTime dateTime)
    {
        return dateTime.Backwards(TimeSpan.FromDays(1));
    }

    public static IEnumerable<DateTime> Backwards(this DateTime dateTime, TimeSpan span)
    {
        return dateTime.Forwards(-span);
    }

    public static bool IsWorkingDay(this DateTime dateTime)
    {
        return dateTime.IsWorkingDay(Thread.CurrentThread.CurrentUICulture);
    }

    public static bool IsWorkingDay(this DateTime dateTime, CultureInfo culture)
    {
        return !dateTime.IsWeekend(culture)
            && !dateTime.IsHoliday(culture);
    }

    public static bool IsWeekend(this DateTime dateTime)
    {
        return dateTime.IsWeekend(Thread.CurrentThread.CurrentUICulture);
    }

    public static bool IsWeekend(this DateTime dateTime, CultureInfo culture)
    {
        // TOOD: Make culturally aware

        return dateTime.DayOfWeek == DayOfWeek.Saturday
            || dateTime.DayOfWeek == DayOfWeek.Sunday;
    }

    public static bool IsHoliday(this DateTime dateTime)
    {
        return dateTime.IsHoliday(Thread.CurrentThread.CurrentUICulture);
    }

    public static bool IsHoliday(this DateTime dateTime, CultureInfo culture)
    {
        throw new NotImplementedException("TODO: Get some culture aware holiday data");
    }
}

然后使用DateTime生成器为某些LINQ表达式提供动力:

        // Display every holiday from today until the end of the year
        DateTime.Today.Forwards()
            .TakeWhile(date => date.Year <= DateTime.Today.Year)
            .Where(date => date.IsHoliday())
            .ForEach(date => Console.WriteLine(date));

你得到了照片

答案 1 :(得分:3)

答案 2 :(得分:1)

看一下它可能对您有用的文章

http://www.codeproject.com/KB/cs/busdatescalculation.aspx

答案 3 :(得分:0)

这是非常愚蠢的算法,但它可以工作8天。如果开始日是周一至周三(包括),则添加 10 天,否则 12 。更一般的是循环添加一天,检查是否是工作日。

答案 4 :(得分:0)

只有七种情况需要考虑,因此我会根据一周中的某天计算减去实际天数(显然不完整或经过测试):

switch (dayOfWeek)
{
    case DayOfWeek.Monday :
    case DayOfWeek.Tuesday :
    case DayOfWeek.Wednesday :
        return 12;
    case DayOfWeek.Thursday :
    case DayOfWeek.Friday :
    case DayOfWeek.Saturday :
        return 10;
    case DayOfWeek.Sunday :
        return 11;
}

答案 5 :(得分:0)

var desiredDate = DateTime.Now.SubtractBusinessDays(8);

在Codeplex上使用Fluent DateTime项目。

答案 6 :(得分:0)

{{1}}