Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向字符串添加特定数量的工作日时间_Php - Fatal编程技术网

Php 向字符串添加特定数量的工作日时间

Php 向字符串添加特定数量的工作日时间,php,Php,我希望为字符串添加一定的时间,但跳过工作日。因此,例如,如果我想在时间戳“2014-04-03 19:33:40”中添加40小时,它将返回“2014-04-07 11:33:40”(跳过周末) 我还需要用几天甚至几分钟来做这件事。以下是我提出的(非工作)函数: function expiration_date($opentime,$tfString) { switch($tfString) { case "daily" : $expira

我希望为字符串添加一定的时间,但跳过工作日。因此,例如,如果我想在时间戳
“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;

}

你在这里看到的是:

  • 我们首先获得需要添加的时间量,然后可以传递到
    DateInterval()
    。如果找不到,我们将返回默认时间

  • 我们创建
    DateInterval()
    对象

  • 我们创建表示开始日期和时间的
    DateTime()
    对象

  • 我们将时间间隔添加到日期时间

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

  • 我们计算出的时间与周六午夜的时间之差

  • 然后我们快进到星期一早上的午夜

  • 然后我们将第6步得到的差异相加

  • 如果我们增加10天,我们将跨越两个周末,因此我们需要额外增加48小时


  • 希望这对您有教育意义,并向您介绍PHP日期时间功能的强大功能。

    工作时间重要吗?不,只有工作日/工作日当我调用addRollover(“2014-03-26 00:00:00”,“daily”)时,我得到了“2014-04-07 00:00:00”,但我希望得到“2014-04-08 00:00:00”(10天)。知道为什么吗?我想不出来。再多尝试十次,如果您发现任何其他不一致的地方,请告诉我。这将有助于调试此问题。我打赌这是因为它跨越多个工作周。请查看我的更新答案是否如您所期望的那样有效。我得到了2014-04-09 00:00:00,这正是我所期望的。03-26现在给出了正确的答案(04-09),但“2014-03-25 00:00:00”给出了04-04,而04-08的预期时间是:
    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