2010-04-12 77 views
0

我一直在努力计算平日里的东西的年龄。我试过了这个问题中详细描述的方法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++ 

必须有实现这一目标的一个更清洁的方式?就好像一件物品变得非常老旧,每一天都在变老,寻找一个周末的日子会对速度产生很大的影响。

任何想法都会很棒!谢谢

+1

你阅读本:http://stackoverflow.com/questions/336127/calculate-business-days-in-php – webbiedave 2010-04-12 15:30:49

+0

没有,我错过了一个,只是阅读,现在,看起来很有希望 – 2010-04-12 15:44:21

+0

这个问题已经整理我!好东西,非常感谢 – 2010-04-12 15:48:11

回答

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 

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

+0

这不包括一周中所有日子的正确年龄。例如,如果创建的日期是星期五,而今天是星期一,则表示它的日期是3天,但只有1天。 – 2010-04-12 15:39:14

+0

就像我说的,我没有弄清楚细节。但你只需要担心编码这些边缘情况的一些,你会没事的。总体思路是一样的。做天 - 地板($天/ 7)* 2并处理边缘情况 – pocketfullofcheese 2010-04-12 16:09:33

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); 

请注意,除法是一个整数除法。