将特定数量的WEEKDAY时间添加到字符串

时间:2014-04-03 23:54:51

标签: php

我希望在字符串中添加一定的时间,但跳过工作日。因此,例如,如果我想在时间戳"2014-04-03 19:33:40"中添加40小时,则会返回"2014-04-07 11:33:40"(已跳过周末)。

我还需要在几天甚至几分钟内完成这项工作。这是我提出的(非工作)功能:

function expiration_date($opentime,$tfString)
{

    switch($tfString)
    {
        case "daily" :
            $expiration_date = gmdate('Y-m-d H:i:s', strtotime($opentime . ' + 10 weekdays'));
            break;

        case "4h":
            $expiration_date = gmdate('Y-m-d H:i:s', strtotime($opentime . ' + 40 weekday hours'));
            break;

        case "1h":
            $expiration_date = gmdate('Y-m-d H:i:s', strtotime($opentime . ' + 10 weekday hours'));
            break;

        case "30m":
            $expiration_date = gmdate('Y-m-d H:i:s', strtotime($opentime . ' + 5 weekday hours'));
            break;

        case "15m":
            $expiration_date = gmdate('Y-m-d H:i:s', strtotime($opentime . ' + 2.5 weekday hours'));
            break;

        default:        $expiration_date = '0000-00-00 00:00:00';
    }

    return $expiration_date;

}

1 个答案:

答案 0 :(得分:1)

function addRollover($opentime , $tfString) {
    switch($tfString) {
        case "daily" :
            $interval = 'P10D'; break;
        case "4h":
            $interval = 'PT40H'; break;
        case "1h":
            $interval = 'PT10H'; break;
        case "30m":
            $interval = 'PT5H'; break;
        case "15m":
            $interval = 'PT2H30M'; break;
        default:        
            return '0000-00-00 00:00:00';
    }
    $interval = new DateInterval($interval);
    $datetime = new DateTime($opentime);
    $datetime->add($interval);

    if (in_array($datetime->format('l'), array('Sunday','Saturday'))) {
        $start = clone $datetime;
        if ('Sunday' === $datetime->format('l')) {
            $start->modify('previous Saturday');
        }
        $start->setTime(0, 0, 0);

        $diff = $start->diff($datetime); 
        $datetime->modify('next Monday'); 
        $datetime->add($diff);

        if ('daily' === $tfString) {
            $datetime->add(new DateInterval('P2D'));
        }
    }
    else if ('daily' === $tfString) {
        $datetime->add(new DateInterval('P4D'));    
    }

    return $datetime->format('Y-m-d H:i:s');
}

echo addRollOver('2014-04-03 19:33:40', '4h'); // 2014-04-07 11:33:40

See it in action

你在这里看到的是什么:

  1. 我们首先需要增加as a string我们可以传递给DateInterval()的时间。如果我们找不到,我们会返回默认时间。

  2. 我们创建了DateInterval()对象。

  3. 我们创建代表我们的开始日期和时间的DateTime()对象。

  4. 我们将时间间隔添加到日期时间。

  5. 如果生成的日期和时间是周末......

  6. 我们发现计算时间与周六午夜之间存在差异

  7. 然后我们快到周一早上午夜

  8. 然后我们添加了第6步

  9. 的差异
  10. 如果我们增加10天,我们将跨越两个周末,所以我们需要额外增加48小时

  11. 希望这对您有所帮助,并向您介绍PHP的DateTime功能。