【问题标题】:Counting the age of an item in weekdays only仅在工作日计算物品的年龄
【发布时间】:2011-02-07 01:37:57
【问题描述】:

我一直在尝试计算平日中某物的年龄。我已经尝试过这个问题中详述的方法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++

必须有一种更清洁的方法来实现这一点吗?好像一件物品会变得很旧,循环遍历它的每一天,寻找一个周末的日子会对速度产生相当大的影响。

任何想法都会很棒!谢谢

【问题讨论】:

  • 不,我错过了,现在正在阅读,看起来很有希望
  • 这个问题已经解决了我的问题!好东西,非常感谢
  • 您不需要将问题标记为已解决,只需接受一个答案,答案的数量将显示为绿色,表示有一个接受的答案。
  • 不客气。很高兴我能帮上忙。

标签: php datetime weekday weekend


【解决方案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);

注意,除法是整数除法。

【讨论】:

    【解决方案2】:

    我相信你可以通过一些数学计算和一些仔细的思考来做到这一点。您需要检查创建项目的星期几以及当前是星期几。首先,您计算它的天数,正如我确定您一开始所做的那样。

    // 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
    

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

    【讨论】:

    • 这不计算一周中所有日子的正确年龄。例如,如果创建的日期是星期五,而今天是星期一,你说它是 3 天前,但它只有 1 天前。
    • 就像我说的,我没有弄清楚细节。但是你只需要担心编码一些边缘情况就可以了。总体思路是一样的。 do days - floor($days/7)*2 并处理边缘情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多