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