2017-12-11 7 views
3

今日から7営業日(土曜日と日曜日を除く)を検索しようとしています。私は週の最後の7日を得ることができますが、7営業日を得ることができません。PHPで最後の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営業日を探し​​ていました。前もって感謝します!

+0

国によって異なるため、休日を確認する定義済みの機能はないと思います。あなたができることは、休日の日付を格納し、あなたのコードでチェックする配列を作成することです。週末の場合は、複数の例を検索して見つけることができます – hungrykoala

答えて

1

休日を見つけることはより複雑になります。 休暇を事前に保存しておき、条件が満たされている場合はそれらをスキップすることができます。

問題の簡単な解決策の1つは、次のようなものです。

<?php 

$holiday = array(
     '2017-12-16' => 'Victory Day of Bangladesh', 
     '2017-12-25' => 'Christmas' 
    ); 


$i = 0; 
$work_day = '2017-12-26'; 
while($i != 7) 
{ 
    $work_day = date('Y-m-d', strtotime('-1 day', strtotime($work_day))); 
    $day_name = date('l', strtotime($work_day)); 

    if($day_name != 'Saturday' && $day_name != 'Sunday' && !isset($holiday[$work_day])) 
    { 
     echo $work_day."\n"; 
     $i++; 
    } 
} 

?> 
2

「仕事の日」を見つけるためにポイントからintに逆方向に作業するのは比較的簡単ですが、「休日」を見つけることははるかに複雑で、これ以上のコードが必要になります。あなたはこの場合P1Dには、希望するどんなinterval値減算するsubメソッドを使用することができますDateTimeクラスを使用

1日です。

$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

あなたは週末なしで7日間が必要な場合は、その日の数値表現をチェックする必要がありますすなわち、"N"Format of date('N')です。 あなたが9日にforループを増やす必要がある2週末日をスキップ:休日を追加する可能性を持つ

//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

1

シンプルコード:

<?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, 
+0

しかし、今日の日付を設定すると、今日の日付から計算されます。 (私は今日もそれを含むことを意味します) –

+0

移動 '$ date-> sub($ interval);' 'if'の上にあるので、日が動作しているかどうかを調べる前に、日付 '-1日'を変更します。昨日から最後の7営業日を検索します。 – JerzySBG

関連する問題