c#如何计算一个月内剩余的工作日

时间:2012-02-20 21:57:54

标签: c#

您好我是c#的新手并且编程一般我一直在尝试通过调整其他人的代码来学习下面的代码我已经更改了代码,因为我想要计算一个月内剩余的工作天数但问题是代码运行一个月内的天数,所以这个月有 29天但代码错误代码运行到 30th 我无法想象改变任何帮助的部分代码将是伟大的

    private void days()
    {

        //Monday to Friday are business days.
        var weekends = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday };
        DateTime testing = DateTime.Now;



        string month1 = testing.ToString("M ");
        string year1 = testing.ToString("yyyy");
        int month = Convert.ToInt32(month1);
        int year = Convert.ToInt32(year1);


        //Fetch the amount of days in your given month.
        int daysInMonth = DateTime.DaysInMonth(year, month);
        string daysleft = testing.ToString("d ");
        int daystoday = Convert.ToInt32(daysleft);

        //Here we create an enumerable from 1 to daysInMonth,
        //and ask whether the DateTime object we create belongs to a weekend day,
        //if it doesn't, add it to our IEnumerable<int> collection of days.
        IEnumerable<int> businessDaysInMonth = Enumerable.Range(daystoday, daysInMonth)
                                               .Where(d => !weekends.Contains(new DateTime(year, month, d).DayOfWeek));

        //Pretty smooth.

        int count = 0;
        foreach (var day in businessDaysInMonth)
        {
            count = count + 1;
        }
        textBox9.Text = count.ToString();


    }
}

3 个答案:

答案 0 :(得分:9)

public static IEnumerable<int> Range(int start, int count)

正如您所看到的,第二个参数不是结束,而是计数。

您想要的计数可能是:daysInMonth - daystoday + 1

我将您的代码重写为:

private static readonly DayOfWeek[] weekends = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday };

bool IsWorkDay(DateTime day)//Encapsulate in a function, to simplify dealing with holydays
{
    return !weekends.Contains(day.DayOfWeek);
}

int WorkDaysLeftInMonth(DateTime currentDate)
{
    var remainingDates = Enumerable.Range(currentDate.Day,DateTime.DaysInMonth(currentDate.Year,currentDate.Month)-currentDate.Day+1)
                        .Select(day=>new DateTime(currentDate.Year, currentDate.Month, day));
    return remainingDates.Count(IsWorkDay);
}

答案 1 :(得分:4)

无需将日期转换为字符串,然后将组件解析回整数值。查看DateTime“测试”的“月”,“日”和“年”属性。

(CodeInChaos有你的答案,但这是一个有趣的事实,将大大简化你的代码。)

答案 2 :(得分:0)

private int GetWorkingDaysLeftInMonth()
    {
        // get the daysInMonth
        int daysInMonth = GetDaysInMonth();

        // locals
        int businessDaysInMonth = 0;
        int day = DateTime.Now.Day;
        bool isWeekDay = false;

        int currentDay = (int) DateTime.Now.DayOfWeek;
        DayOfWeek dayOfWeek = (DayOfWeek)currentDay;

        // iterate the days in month
        for (int x = day; x < daysInMonth; x++)
        {
            // increment the current day
            currentDay++;

            // if the day is greater than 7
            if (currentDay > 7)
            {
                // reset the currentDay
                currentDay = 1;
            }

            // get the dayOfWeek
            dayOfWeek = (DayOfWeek) currentDay;

            switch(dayOfWeek)
            {
                case DayOfWeek.Monday:
                case DayOfWeek.Tuesday:
                case DayOfWeek.Wednesday:
                case DayOfWeek.Thursday:
                case DayOfWeek.Friday:

                    // is a week day
                    isWeekDay = true;

                    // required
                    break;

                default:

                    // is a NOT week day
                    isWeekDay = true;

                    // required
                    break;
            }

            if (isWeekDay)
            {
                // increment the value
                businessDaysInMonth++;  
            }
        }

        // return value
        return businessDaysInMonth;
    }

    private int GetDaysInMonth()
    {
        // initial value
        int daysInMonth = 0;

        switch(DateTime.Now.Month)
        {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:

                daysInMonth = 31;

                // required;
                break;

            case 2:

                daysInMonth = 28;

                // to do (leap year)
                bool isLeapYear = IsLeapYear();

                // if isLeapYear
                if (isLeapYear)
                {
                    // set to 29
                    daysInMonth = 29;
                }

                // required
                break;

            case 4:
            case 6:
            case 9:
            case 11:

                daysInMonth = 30;

                // required;
                break;
        }

        // return value
        return daysInMonth;
    }

    private bool IsLeapYear()
    { 
        // initial value
        bool isLeapYear = false;

        int year = DateTime.Now.Year;

        //determine the year
        switch(year)
        {
            case 2012:
            case 2016:
            case 2020:
            // to do: Go as far out as you need to

                // set to true
                isLeapYear = true;

                // required
                break;
        }

        // return value
        return isLeapYear;
    }