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

本文关键字:工作日 一个 何计算 计算 | 更新日期: 2023-09-27 18:25:17

嗨,我是c#和编程的新手,通常我一直在尝试从改编其他人的代码中学习下面的代码。我已经更改了代码,因为我想计算一个月内剩余的工作天数,但问题是代码超过了一个月的天数,所以这个月有29天,但当代码运行到第30次我不知道更改代码的哪一部分,任何帮助都是很棒的

    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();

    }
}

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

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

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

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

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