php - 在 PHP 中查找最近 7 个工作日

标签 php datetime

我想找出当天的最后 7 个工作日(不包括周六和周日)。我能够获得一周的最后 7 天,但无法获得 7 个工作日。

//code to found last 7 days  
$date = '04/30/2009'; // set current date
// parse about any English textual datetime description into a Unix timestamp 
$ts = strtotime($date);
// calculate the number of days since Monday
$dow = date('w', $ts);
$offset = $dow - 1;
if ($offset < 0) {
    $offset = 6;
}
// calculate timestamp for the Monday
$ts = $ts - $offset*86400;
// loop from Monday till Sunday 
for ($i = 0; $i < 7; $i++, $ts += 86400){
    print date("m/d/Y l", $ts) . "\n". "<br>";
}

但我想找到最近 7 个工作日。提前致谢!

最佳答案

从一个时间点向后查找“工作日”相对容易,但查找“假期”要复杂得多,我怀疑需要的代码比这多得多。

使用 DateTime 类,您可以使用 sub 方法减去您想要的任何 interval 值,在本例中为 P1D 是一天。

$strdate='04/30/2009';
$days=11;

$timezone=new DateTimeZone('Europe/London');
$interval=new DateInterval('P1D');

$start=new DateTime( date( DATE_COOKIE, strtotime( $strdate ) ), $timezone );
$end=new DateTime( date( DATE_COOKIE, strtotime( $start->format( DATE_COOKIE ) . '-' . $days .' days' ) ), $timezone );


$dates=array();
while( $start->sub( $interval ) > $end ){
    /* is the day integer less than 6(sat)? */
    if( $start->format('N') < 6 && count( $dates ) < 7 ) $dates[]=$start->format( DATE_COOKIE );
}

echo '<pre>',print_r( $dates,true ),'</pre>';

这个输出:

Array
(
    [0] => Wednesday, 29-Apr-09 00:00:00 BST
    [1] => Tuesday, 28-Apr-09 00:00:00 BST
    [2] => Monday, 27-Apr-09 00:00:00 BST
    [3] => Friday, 24-Apr-09 00:00:00 BST
    [4] => Thursday, 23-Apr-09 00:00:00 BST
    [5] => Wednesday, 22-Apr-09 00:00:00 BST
    [6] => Tuesday, 21-Apr-09 00:00:00 BST
)

我玩了一下 public api for getting public holiday信息并将以下内容拼凑在一起......我不知道这个 api 对不同国家有什么样的覆盖范围,但可能值得调查。

可以查到不同国家和地区的代码here

$api='http://kayaposoft.com/enrico/json/v1.0/';
$params=array(
    'action'    =>  'getPublicHolidaysForDateRange',
    'fromDate'  =>  '',
    'toDate'    =>  '',
    'country'   =>  'eng'    #England
);

$strdate='2017/12/30';
$days=7;

$timezone=new DateTimeZone('Europe/London');
$interval=new DateInterval('P1D');

$start=new DateTime( date( 'Y-m-d', strtotime( $strdate ) ), $timezone );
$end=new DateTime( date( 'Y-m-d', strtotime( $start->format( 'Y-m-d' ) . '-' . $days .' days' ) ), $timezone );



$params['fromDate']=$end->format('d-m-Y');
$params['toDate']=$start->format('d-m-Y');

$query=http_build_query( $params );
$url=$api.'?'.$query;



$json=json_decode( file_get_contents( $url ) );
if( json_last_error() !== 0 ){
    $json=false;
}

function isholiday( $obj=false, $y=0, $m=0, $d=0 ){
    if( $obj && !empty( $obj ) ){
        foreach( $obj as $item ){
            $date=$item->date;
            if( $date->day==$d && $date->month=$m && $date->year==$y ) return $item->localName;
        }
    }
    return false;
}



$dates=array();
while( $start->sub( $interval ) > $end ){
    if( $start->format('N') < 6 && count( $dates ) < $days ) {

        $holiday=isholiday( $json, $start->format('Y'), $start->format('m'), $start->format('d') );

        $date=$start->format( 'Y-m-d' );

        $dates[]=$holiday ? $date .' - '.$holiday : $date;
    }
}

echo '<pre>',print_r( $dates, true ),'</pre>';

输出如下:

Array
(
    [0] => 2017-12-29
    [1] => 2017-12-28
    [2] => 2017-12-27
    [3] => 2017-12-26 - Boxing Day
    [4] => 2017-12-25 - Christmas Day
)

关于php - 在 PHP 中查找最近 7 个工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47749893/

相关文章:

php - 正在寻找有关如何创建简单文本编辑器的教程?

php - 错误警告:mysql_fetch_array()期望参数1为资源, bool 值在[duplicate]中给出

python - 根据时间列的内容分离 Pandas 数据框

Python/Pandas 根据 DateTime 值创建分类列

c# - Noda Time - 从 DateTime 和 TimeZoneId 创建 ZonedDateTime

java - MS Word 识别标题/字体等?

php - 如何增加 apache 进程或并发 php 文件的数量?

JavaScript 周选择器

php - 在 PHP 中仅选择 xpath 结果集的第一项

Python 日期哈希表