计算两个日期之间的工作时间 [英] Calculating working hours between two dates
问题描述
我需要一种PHP方法,用于计算两个日期之间的工作时间,基于8小时工作日,不包括周末和银行假日。
I need a PHP method for calculating working hours between two dates based on a 8 hour working day and excluding weekends and bank holidays.
例如, code> 2012-01-01T08:30:00 AND 2012-01-05T10:30:00
在工作时间其实是26工作时间,因为前两天是周末/银行假期,只剩下3个工作日,时间差异为2小时,即 3 * 8 + 2 = 26
。
For example the difference between 2012-01-01T08:30:00
AND 2012-01-05T10:30:00
in working hours is actually 26 working hours because the first two days are weekend/bank holiday which just leaves 3 working days and the time differnce of 2 hours i.e. 3*8+2=26
.
我已经使用@flamingLogos 上一个问题的出色答案但是无法考虑到时间和日期。
I have used @flamingLogos excellent answer to a previous question but cannot get it to take into account the time as well as date.
推荐答案
下面的函数计算两个日期之间的工作时间,以2013-11-27 13:40等文字格式提供,工作时间为9至17天(可更改)。
Function below calculates working hours between two dates, provided in text format such as '2013-11-27 13:40', taking work day hours from 9 to 17 (can be changed).
function get_working_hours($from,$to)
{
// timestamps
$from_timestamp = strtotime($from);
$to_timestamp = strtotime($to);
// work day seconds
$workday_start_hour = 9;
$workday_end_hour = 17;
$workday_seconds = ($workday_end_hour - $workday_start_hour)*3600;
// work days beetwen dates, minus 1 day
$from_date = date('Y-m-d',$from_timestamp);
$to_date = date('Y-m-d',$to_timestamp);
$workdays_number = count(get_workdays($from_date,$to_date))-1;
$workdays_number = $workdays_number<0 ? 0 : $workdays_number;
// start and end time
$start_time_in_seconds = date("H",$from_timestamp)*3600+date("i",$from_timestamp)*60;
$end_time_in_seconds = date("H",$to_timestamp)*3600+date("i",$to_timestamp)*60;
// final calculations
$working_hours = ($workdays_number * $workday_seconds + $end_time_in_seconds - $start_time_in_seconds) / 86400 * 24;
return $working_hours;
}
还有两个附加功能。一个返回工作日数组...
There are two additional functions. One returns work days array...
function get_workdays($from,$to)
{
// arrays
$days_array = array();
$skipdays = array("Saturday", "Sunday");
$skipdates = get_holidays();
// other variables
$i = 0;
$current = $from;
if($current == $to) // same dates
{
$timestamp = strtotime($from);
if (!in_array(date("l", $timestamp), $skipdays)&&!in_array(date("Y-m-d", $timestamp), $skipdates)) {
$days_array[] = date("Y-m-d",$timestamp);
}
}
elseif($current < $to) // different dates
{
while ($current < $to) {
$timestamp = strtotime($from." +".$i." day");
if (!in_array(date("l", $timestamp), $skipdays)&&!in_array(date("Y-m-d", $timestamp), $skipdates)) {
$days_array[] = date("Y-m-d",$timestamp);
}
$current = date("Y-m-d",$timestamp);
$i++;
}
}
return $days_array;
}
第二 - 返回节日数组
and second - returns holidays array
function get_holidays()
{
// arrays
$days_array = array();
// You have to put there your source of holidays and make them as array...
// For example, database in Codeigniter:
// $days_array = $this->my_model->get_holidays_array();
return $days_array;
}
这篇关于计算两个日期之间的工作时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!