PHP将确切的工作日添加到时间戳

时间:2014-03-18 10:49:21

标签: php

我想在当前时间戳中添加x个工作日(例如48个工作日小时)。我试图使用以下

来做到这一点
echo (strtotime('2 weekdays');

但是,这似乎并没有提前48小时。例如,输入星期二18/03/2014 10:47 的当前服务器时间将返回星期四20/03/2014 00:00 。使用以下功能:

echo (strtotime('2 weekdays')-mktime())/86400;

它可以告诉它从现在开始只返回 1.3个工作日

为什么这样做?是否有任何现有功能允许精确的工作日时间?

3 个答案:

答案 0 :(得分:2)

鉴于您希望保留weekdays功能并且不会丢失小时,分钟和秒,您可以这样做:

$now = new DateTime();
$hms = new DateInterval(
    'PT'.$now->format('H').'H'.
    $now->format('i').'M'.
    $now->format('s').'S'.
);
$date = new DateTime('2 weekdays');
$date->add($hms);//add hours here again

weekday没有添加小时数的原因是,如果您在星期一的任何时间点添加1个工作日,则下一个工作日 将是星期二。
小时无关紧要。假设您的日期为2014-01-02 12:12:12,并且您希望下一个工作日,那一天从2014-01-03 00:00:00开始,以便您得到的结果。

我的上一个解决方案虽然有效,但问题如下:我使用$now的{​​{1}}实例及其DateTime方法构建format格式字符串,传递给构造函数。区间格式非常简单:它以DateInterval开头,为期间,然后是数字和字符,表示该数字代表的内容:1年为1年,2D为2天。
但是,我们只对小时,分钟和秒钟感兴趣。实际时间,使用区间格式字符串中的P表示,因此我们使用T(句点时间)启动字符串。
使用格式说明符PTHi,我们构造了一个间隔格式,在12:12:12的情况下如下所示:

s

然后,调用$hms = new DateInterval( 'PT12H12M12S' ); 方法将小时,分钟和秒添加到我们的日期+工作日是一件简单的事情:

DateTime::add

你在那里 或者,您可以使用基本相同的技巧来计算初始日期与该日期+ x个工作日之间的实际日差,然后将该差异添加到您的初始日期。它具有相同的基本原则,但不必创建类似$weekdays = new DateTime('6 weekdays'); $weekdays->add($hms); echo $weekdays->format('Y-m-d H:i:s'), PHP_EOL; 的格式,只需要一个简单的PTXHXMXS

Working example here

我敦促你使用PXD类,因为它更灵活,允许使用类型提示,并使我们所有人更容易处理日期。此外,它与您当前的代码没有什么不同:

DateInterface

事实上,如果你想在一个日期进行频繁的日期操作,那就容易多了:

$today = new DateTime;
$tomorrow = new DateTime('tomorrow');
$dayAfter = new DateTime('2 days');

很容易,一旦您花了一些时间浏览the docs

答案 1 :(得分:1)

我想我找到了解决方案。它是原始的,但在经过一些快速测试之后似乎有效。

该函数计算从当天午夜起经过的时间,并将其添加到strtotime返回的日期。由于这可能属于周末,我已经检查并相应增加了一两天。

function weekDays($days)   {
    $tstamp = (strtotime($days.' weekdays') + (time() - strtotime("today")));
    if(date('D',$tstamp) == 'Sat')  {
        $tstamp = $tstamp + 86400*2;
    }
    elseif(date('D',$tstamp) == 'Sun')  {
        $tstamp = $tstamp + 86400;
    }

    return $tstamp;
}

答案 2 :(得分:0)

函数strtotime('2 weekdays')似乎在没有时间的情况下将2个工作日添加到当前日期 如果你想增加48小时,为什么不向mktime()添加2 * 24 * 60 * 60?

echo(date('Y-m-d', mktime()+2*24*60*60));