c# - c#Web应用程序如何获取不包括周末和公共假期的工作日
问题描述
背景资料
刚开始学习 C#,我正在尝试构建一个简单的 Web 应用程序来计算两个日期之间的工作日数。
The UI of the web app
基本逻辑是当用户输入一个日期(即01/05/2018)并点击按钮时,它会计算工作日的总数(不包括周末和公共假期)。
现在的问题是计算不准确,即在 23/05/2018 和 31/05/2018 之间显示 6,应该是 7 天。并且在计算过程中不考虑日期
namespace testtest
{
public partial class First : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
//on btn click
protected void Button1_Click(object sender, EventArgs e)
{
string dt = TextBox1.Text;
DateTime dtDDMMYYYY = ParseDate(dt);
string dt2 = TextBox2.Text;
DateTime dtDDMMYYYY2 = ParseDate(dt2);
List<DateTime> list = new List<DateTime> {
DateTime.ParseExact("04/05/2018", "dd/MM/yyyy",
CultureInfo.InvariantCulture) };
DaysLeft(dtDDMMYYYY, dtDDMMYYYY2, true, list);
}
public DateTime ParseDate(string date)
{
DateTimeFormatInfo dateFormatProvider = new DateTimeFormatInfo();
dateFormatProvider.ShortDatePattern = "dd/MM/yyyy";
return DateTime.Parse(date, dateFormatProvider);
}
public int DaysLeft(DateTime startDate, DateTime endDate, Boolean
excludeWeekends, List<DateTime> excludeDates)
{
int count = 0;
for (DateTime index = startDate; index < endDate; index =
index.AddDays(1))
{
if (excludeWeekends && index.DayOfWeek != DayOfWeek.Sunday &&
index.DayOfWeek != DayOfWeek.Saturday)
{
bool excluded = false; ;
for (int i = 0; i < excludeDates.Count; i++)
{
if (index.Date.CompareTo(excludeDates[i].Date) == 0)
{
excluded = true;
break;
}
}
if (!excluded)
{
count++;
}
}
}
result.Text = count.ToString();
return count;
}
}
}
解决方案
把事情简单化
public int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, List<DateTime> excludeDates) {
int count = 0;
for (DateTime index = startDate; index <= endDate; index = index.AddDays(1)) {
if (excludeWeekends && (index.DayOfWeek == DayOfWeek.Sunday || index.DayOfWeek == DayOfWeek.Saturday))
continue;
if (excludeDates.Contains(index.Date))
continue;
count++;
}
return count;
}
如果日期是周末并被excludeWeekends
标记,则继续到下一个日期,如果日期包含在excludeDates
继续中,则计算当天。
推荐阅读
- python-3.x - 使用 PIL 保存模式错误将 png 转换为 pdf
- c# - 为什么 C# 编译器认为我在使用可为空的 long 时尝试使用 sbyte 重载?
- spring - Spring Batch,在 writer 中获取 stepExecution?
- swift - 在 CollectionView 中拖放:PBItemCollectionServicer 连接断开
- r - 如何将非 R 对象与 R 对象一起“序列化”
- reactjs - 将 p5.Sound 导入/使用到 React
- jmeter - 从 Jmeter 中的 CSV 文件读取问题
- vba - Excel VBA:根据单元格值添加/删除行;Offset() 的问题
- computer-vision - 用 OpenCV 将人脸与人脸照片区分开来
- java - 从 for 循环中检索特定值