当前位置: 首页 > 工具软件 > PHP Carbon > 使用案例 >

php 两个日期之间的工作日,PHP Carbon日期差异只有工作日

曾航
2023-12-01

我试图在人类格式的两个日期之间取得差异,但仅限于工作日.这是我的实际代码:

$start = '2018-09-13 09:30:00';

$end = '2018-10-16 16:30:00';

$from = Carbon::parse($start);

$to = Carbon::parse($end);

$weekDay = $from->diffInWeekdays($to);

$human = $to->diffForHumans($from, true, false, 6);

var_dump($weekDay); //24

var_dump($human); // 1 month 3 days 7 hours

diffForHumans非常适合我的需求,但我找不到像diffInDaysFiltered那样的过滤方法

我想要达到的目的是得到这样的结果:24天7小时,因为我们只有24个工作日

我首先尝试使用preg_replace以$weekDay结果替换3天但是如果我们有一个月之前它是不正确的我有:1个月24天7小时

我的问题有什么解决方案吗?

最佳答案 这是答案,感谢

imbrish

我需要使用级联因子来定义:

>一天多少小时

>一周多少天

>一个月多少天

然后使用diffFiltered,我只能选择工作日和工作时间.由于宏,您还可以在公共假期添加过滤器

CarbonInterval::setCascadeFactors(array(

'days' => array(10, 'hours'),

'weeks' => array(5, 'days'),

'months' => array(20, 'days'),

));

$resolution = CarbonInterval::hour();

$start = Carbon::parse('2017-07-13 11:00');

$end = Carbon::parse('2017-07-17 18:00');

$hours = $start->diffFiltered($resolution, function ($date) {

return $date->isWeekday() && $date->hour >= 8 && $date->hour < 18;

}, $end);

$interval = CarbonInterval::hours($hours)->cascade();

echo $interval->forHumans(); // 2 days 7 hours

这是macro部分:

Carbon::macro('isHoliday', function ($self = null) {

// compatibility chunk

if (!isset($self) && isset($this)) {

$self = $this;

}

// Put your array of holidays here

return in_array($self->format('d/m'), [

'25/12', // Christmas

'01/01', // New Year

]);

});

然后简单地添加&& !$date->在diffFiltered中的isHoliday()

 类似资料: