我想在当前时间戳中添加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个工作日。
为什么这样做?是否有任何现有功能允许精确的工作日时间?
答案 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
(句点时间)启动字符串。
使用格式说明符PT
,H
和i
,我们构造了一个间隔格式,在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
。
我敦促你使用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));