用PHP查找过去7个工作日

时间:2017-12-11 09:36:10

标签: 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个工作日。提前谢谢!

4 个答案:

答案 0 :(得分:1)

从某个时间点开始向后工作相对容易找到工作日&#34;但找到&#34;假期&#34;更加复杂,需要的代码比我怀疑的要多得多。

使用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
)

答案 1 :(得分:0)

如果您需要7天没有周末日,则需要检查星期几的数字表示,即"N" Format of date('N')。 在跳过2个周末时,您需要将for循环增加到9天:

//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 < 9; $i++, $ts += 86400){
  if(date("N", $ts) < 6){ // day code is less then weekday 6 & 7
  print  date("m/d/Y l", $ts) . "\n". "<br>";
  }
}

https://eval.in/916514

答案 2 :(得分:0)

可以添加假期的简单代码:

<?php
$date = new DateTime('03/02/2009');
$interval = new DateInterval('P1D');

function isWorkingDay($date)
{
    $weekDay = $date->format('w');
    if ($weekDay == 0) // sunday
        return false;
    if ($weekDay == 6) // saturday
        return false;
    if ($date->format('m-d') == '07-05') // your check, example 5th July
        return false;
    return true;
}

$workingDays = [];

while(count($workingDays) != 7) {
    if(isWorkingDay($date)) {
        $workingDays[] = clone $date;
    }
    $date->sub($interval);
}
foreach($workingDays as $workingDay) {
    echo $workingDay->format('Y-m-d') . ', ';
}

结果 - 没有周末的天数列表:

2009-03-02, 2009-02-27, 2009-02-26, 2009-02-25, 2009-02-24, 2009-02-23, 2009-02-20,

答案 3 :(得分:0)

寻找假期会更复杂。 一种解决方案可以是提前节省假期,如果他们遇到这种情况就跳过它们。

解决问题的一个简单方法就是这样。

tidyr