给定两个日期时间。计算他们之间的工作时间的最佳方法是什么?考虑到工作时间为周一 8 - 5.30,周二至周五 8.30 - 5.30,并且任何一天都可能是公共假期。
这是我的努力,看起来效率低得可怕,但就迭代次数而言,并且 IsWorkingDay 方法会访问数据库以查看该日期时间是否是公共假期。
任何人都可以建议任何优化或替代方案。
public decimal ElapsedWorkingHours(DateTime start, DateTime finish)
{
decimal counter = 0;
while (start.CompareTo(finish) <= 0)
{
if (IsWorkingDay(start) && IsOfficeHours(start))
{
start = start.AddMinutes(1);
counter++;
}
else
{
start = start.AddMinutes(1);
}
}
decimal hours;
if (counter != 0)
{
hours = counter/60;
}
return hours;
}
在开始优化之前,问自己两个问题。
a) 有效吗?
b) 速度是否太慢?
只有当两个问题的答案都是“是”时,您才准备好开始优化。
除此之外
- 您只需要担心开始日和结束日的分钟和小时。除非是假期或周末,否则中间的日子显然将是整整 9/9.5 小时
- 无需检查周末是否是假期
我就是这样做的
// Normalise start and end
while start.day is weekend or holiday, start.day++, start.time = 0.00am
if start.day is monday,
start.time = max(start.time, 8am)
else
start.time = max(start.time, 8.30am)
while end.day is weekend or holiday, end.day--, end.time = 11.59pm
end.time = min(end.time, 5.30pm)
// Now we've normalised, is there any time left?
if start > end
return 0
// Calculate time in first day
timediff = 5.30pm - start.time
day = start.day + 1
// Add time on all intervening days
while(day < end.day)
// returns 9 or 9.30hrs or 0 as appropriate, could be optimised to grab all records
// from the database in 1 or 2 hits, by counting all intervening mondays, and all
// intervening tue-fris (non-holidays)
timediff += duration(day)
// Add time on last day
timediff += end.time - 08.30am
if end.day is Monday then
timediff += end.time - 08.00am
else
timediff += end.time - 08.30am
return timediff
你可以做类似的事情
从假期中选择计数(天),其中@Start和@End之间的假期按天分组
计算星期一、星期二、星期三等的假期数。可能是一种让 SQL 只计算星期一和非星期一的方法,但目前想不出任何办法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)