仅在工作日计算项目的年龄

时间:2010-04-12 15:25:49

标签: php datetime weekday weekend

我一直在努力计算工作日的某些年龄。我已经尝试了这个问题中详述的方法,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++

必须有更清洁的方法来实现这一目标吗?好像一个项目变得很老,循环遍历它的每一天,寻找一个周末的日子会影响速度。

任何想法都会很棒!感谢

2 个答案:

答案 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

你必须检查一下是否有效。也许你可以在不将你的约会日期转移到周末之前/之后进行计算。它可能不完美,但它是正确的想法。无需迭代。