我一直在努力计算工作日的某些年龄。我已经尝试了这个问题中详述的方法,Given a date range how to calculate the number of weekends partially or wholly within that range?但它似乎不适合我的用例。
项目在数据库中有一个创建的DATETIME
,如果创建的日期超过2天,我需要将其标记为旧。但是,客户要求年龄只计算工作日(周一至周五)并排除周六+周日。
到目前为止,我的伪代码如下所示,
now - created_datetime = number_of_days
for(i number_of_days)
if(created_datetime - i)
is a weekday, then age++
必须有更清洁的方法来实现这一目标吗?好像一个项目变得很老,循环遍历它的每一天,寻找一个周末的日子会影响速度。
任何想法都会很棒!感谢
答案 0 :(得分:1)
您只需查看过去7天即可了解工作日的确切年龄。
这是直觉:
减去对象的总年龄,即其生命周期的周末数。请注意,每隔7天就有2个周末。再加上剩余天数中的周末天数(不是整周的周末天数),你必须在其生命周期中总周末天数。减去实际年龄以获得工作日年龄。
int weekendCount = 0;
// Check the remainder days that are not in a full week.
for (int i = totalAge % 7; i < 7; i++) {
if (created_datetime - i is weekend) {
weekendCount++;
}
}
weekdayAge = totalNumberOfDays - (((totalNumberOfDays / 7) * 2) + weekendCount);
请注意,除法是整数除法。
答案 1 :(得分:0)
我相信你可以通过一些数学和一些细心的思考来做到这一点。您需要检查项目创建的星期几和当前的星期几。首先,你计算它的天数,因为我相信你一开始就做了。
// if today is saturday, subtract 1 from the day. if its sunday, subtract 2
if (now() is sunday) $now = now() - 2 days;
if (now() is saturday) $now = now() - 1 day;
// same thing for $date posted. but adding 1 or 2 days
if ( $date is saturday) $date = $date + 2;
if ( $date is sunday) $date = $date + 1;
// get days difference
$days = $today - $date;
// have to subtract 2 days for every 7
$days = $days - floor($days/7)*2
你必须检查一下是否有效。也许你可以在不将你的约会日期转移到周末之前/之后进行计算。它可能不完美,但它是正确的想法。无需迭代。