这个函数还能有更好的实现吗?

call_from_dream 2016-12-03 01:05:58
小弟刚写了一个函数,是求两个日期之间,除去周末后,剩余天数的。我用的是比较笨的方法,按起始日期从周一到周日,分为7类,然后每一类里,结束日期按照星期又分成几类,然后一 一实现功能。写完后,感觉算法上写的不是太好。不知道各位大神还有没有好的思路可以更好的实现这个功能?
PS:一开始是用swich-case 语句实现的,功能实现后,发现return 变量时,报错,说return的local变量未赋值。小弟我只好用if-else语句重写了这个功能。
static int workdaysCalculate(DateTime beginTime, DateTime endTime)
{
byte bt = (byte)(beginTime.DayOfWeek);
byte et = (byte)(endTime.DayOfWeek);
int spanDays = endTime.Subtract(beginTime).Days;
int workDays;

if (6 == bt)
{
if (6 == et)
{
workDays = spanDays * 5 / 7;
}
else if (0 == et)
{
workDays = (spanDays - 1) * 5 / 7;
}
else
{
workDays = (spanDays - et - 1) * 5 / 7 + et - 1;
}
}
else if (0 == bt)
{
if (0 == et)
{
workDays = (spanDays - et) * 5 / 7;
}
else
{
workDays = (spanDays - et) * 5 / 7 + et - 1;
}
}
else if (1 == bt)
{
if (0 == et)
{
workDays = (spanDays - 6) * 5 / 7 + 5;
}
else
{
workDays = (spanDays - et + 1) * 5 / 7 + et - 1;
}
}
else if (2 == bt)
{
if ((0 == et) || (1 == et))
{
workDays = (spanDays - 5 - et) * 5 / 7 + 4;
}
{
workDays = (spanDays - et + 2) * 5 / 7 + et - 2;
}
}
else if (3 == bt)
{
if (0 == et)
{
workDays = (spanDays - 4) * 5 / 7 + 3;
}
else if ((1== et)||(2==et))
{
workDays = (spanDays - et - 4) * 5 / 7 + et + 2;
}else
{
workDays = (spanDays - et + 3) * 5 / 7 + et - 3;
}
}
else if (4 == bt)
{
if (0 == et)
{
workDays = (spanDays - 3) * 5 / 7 + 2;
}
else if ((4 == et) || (5 == et) || (6 == et))
{
workDays = (spanDays - et + 4) * 5 / 7 + et - 4;
}
else
{
workDays = (spanDays - et - 3) * 5 / 7 + et + 1;
}
}
else
{
if (0 == et)
{
workDays = (spanDays - 2) * 5 / 7 + 1;
}
else if ((5 == et) || (6 == et))
{
workDays = (spanDays - et + 5) * 5 / 7 + et - 5;
}
else
{
workDays = (spanDays - et - 2) * 5 / 7 + et;
}
}

/*
switch (bt)
{
//When begin day is Saturday
case 6:
switch (et)
{
case 6:
workDays = spanDays * 5 / 7;
break;
case 0:
workDays = (spanDays - 1) * 5 / 7;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
workDays = (spanDays-et-1) * 5 / 7 + et-1;
break;
}
break;
//When begin day is Sunday.
case 0:
switch (et)
{
case 0:
workDays = (spanDays - et) * 5 / 7;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
workDays = (spanDays - et) * 5 / 7 + et - 1;
break;
}

break;

case 1:
switch (et)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
workDays = (spanDays - et + 1) * 5 / 7 + et - 1;
break;
case 0:
workDays = (spanDays-6) * 5 / 7 + 5;
break;
}
break;

case 2:
switch (et)
{
case 2:
case 3:
case 4:
case 5:
case 6:
workDays = (spanDays - et + 2) * 5 / 7 + et - 2;
break;
case 0:
case 1:
workDays = (spanDays - 5 - et) * 5 / 7 + 4;
break;
}
break;

case 3:
switch (et)
{
case 3:
case 4:
case 5:
case 6:
workDays = (spanDays - et + 3) * 5 / 7 + et - 3;
break;
case 0:
workDays = (spanDays - 4) * 5 / 7 + 3;
break;
case 1:
case 2:
workDays = (spanDays - et - 4) * 5 / 7 + et + 2;
break;
}
break;

case 4:
switch (et)
{
case 4:
case 5:
case 6:
workDays = (spanDays - et + 4) * 5 / 7 + et - 4;
break;
case 0:
workDays = (spanDays - 3) * 5 / 7 + 2;
break;
case 1:
case 2:
case 3:
workDays = (spanDays - et - 3) * 5 / 7 + et + 1;
break;
}
break;

case 5:
switch (et)
{
case 5:
case 6:
workDays = (spanDays - et + 5) * 5 / 7 + et - 5;
break;
case 0:
workDays = (spanDays - 2) * 5 / 7 + 1;
break;
case 1:
case 2:
case 3:
case 4:
workDays = (spanDays - et - 2) * 5 / 7 + et;
break;
}
break;
}
*/
return workDays;

}
...全文
181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
call_from_dream 2016-12-05
  • 打赏
  • 举报
回复
引用 1 楼 kernelkoder 的回复:
我建议你看看java jdk的源码,里面肯定有答案的,而且是高手写的 java里面肯定有这种功能的实现
谢谢!
kernelkoder 2016-12-04
  • 打赏
  • 举报
回复
我建议你看看java jdk的源码,里面肯定有答案的,而且是高手写的 java里面肯定有这种功能的实现

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧