我想计算编码日期和完成日期之间的小时数。截至目前,我可以计算两个日期时间之间的时差,不包括星期六和星期日。我的问题是我需要排除午休时间(上午12:00至下午1:00)和假期。
这是我的代码:
<?php
function business_hours($start, $end){
$startDate = new DateTime($start);
$endDate = new DateTime($end);
$periodInterval = new DateInterval( "PT1H" );
$period = new DatePeriod( $startDate, $periodInterval, $endDate );
$count = 0;
$holidays = [
"Human Rights Day" => new DateTime(date('Y') . '-03-21'),
"Good Friday" => new DateTime(date('Y') . '-03-30'),
"Family Day" => new DateTime(date('Y') . '-04-02'),
"Freedom Day" => new DateTime(date('Y') . '-04-27'),
"Labour Day" => new DateTime(date('Y') . '-05-01'),
"Youth Day" => new DateTime(date('Y') . '-06-16'),
"National Women's Day" => new DateTime(date('Y') . '-08-09'),
"Heritage Day" => new DateTime(date('Y') . '-09-24'),
"Day of Reconciliation" => new DateTime(date('Y') . '-12-16'),
];
foreach($period as $date){
$startofday = clone $date;
$startofday->setTime(8,00);
$endofday = clone $date;
$endofday->setTime(17,00);
if($date > $startofday && $date <= $endofday && !in_array($date->format('l'), array('Sunday','Saturday'))){
$count++;
}
}
echo $count;
}
$start = '2020-02-14 08:00:00';
$end = '2020-02-17 08:00:00';
$go = business_hours($start,$end);
//output 9 hours
?>
根据我的代码,我将工作时间设置为8:00至17:00,然后排除了周六和周日。根据我的例子,输出将为9(包括午休时间)。如何排除午休和节假日?
更新
完成时间可以超过 1 天。例如,开始日期/时间为 2020-02-14 08:00:00,完成时间为 2020-02-19 08:00:00,输出为 27 小时。计算应排除每天中午12:00至下午1:00的午休时间以及介于两者之间的假期。
更新
我添加了一系列假期,如何排除这些假期?
HUX布斯
汪汪一只猫