2017-12-31 149 views
3

2つの時間間隔からすべての金曜日の日付を取得したいと考えています。 私のフレームワークはlaravelです。2つの時間間隔の間にfriday日付を取得する方法

私の機能:

public function getFridaysInRange($dateFromString, $dateToString) 
{ 
    $dateFrom = new \DateTime($dateFromString); 
    $dateTo = new \DateTime($dateToString); 
    $dates = []; 

    if ($dateFrom > $dateTo) { 
     return $dates; 
    } 

    if (1 != $dateFrom->format('N')) { 
     $dateFrom->modify('next friday'); 
    } 

    while ($dateFrom <= $dateTo) { 
     $dates[] = $dateFrom->format('Y-m-d'); 
     $dateFrom->modify('+1 week'); 
    } 

    return $dates; 
} 

しかし、それは返す2日から:

"["2017-12-25","2018-01-01","2018-01-08","2018-01-15","2018-01-22","2018-01-29","2018-02-05","2018-02-12","2018-02-19","2018-02-26","2018-03-05","2018-03-12","2018-03-19","2018-03-26","2018-04-02","2018-04-09","2018-04-16","2018-04-23","2018-04-30","2018-05-07","2018-05-14","2018-05-21","2018-05-28","2018-06-04","2018-06-11","2018-06-18","2018-06-25","2018-07-02","2018-07-09","2018-07-16","2018-07-23","2018-07-30","2018-08-06","2018-08-13","2018-08-20","2018-08-27","2018-09-03","2018-09-10","2018-09-17","2018-09-24","2018-10-01","2018-10-08","2018-10-15","2018-10-22","2018-10-29","2018-11-05","2018-11-12","2018-11-19","2018-11-26","2018-12-03","2018-12-10","2018-12-17","2018-12-24","2018-12-31"]" 

私の問題はありますか?

+0

2つの日付が返されたということでした何から? – gview

答えて

2

あなたはカーボンを使用することができます。

$dateTo = Carbon::parse($dateToString); 
$friday = Carbon::parse($dateFromString . ' next friday'); 
$fridays = []; 

while($friday->lt($dateTo)) { 
    $fridays[] = $friday->toDateString(); 
    $friday->addWeek(); 
} 

return $fridays; 
1

次の関数を試してみてください。

function getWeekDays($start, $end, $weekday) 
{ 
    $start = strtotime($start); 
    $end = strtotime($end); 

    $weekdays = array(); 

    while (date("w", $start) != $weekday) { 
     $start += 86400; 
    } 

    while ($start <= $end) 
    { 
     $weekdays[] = date('Y-m-d', $start); 
     $start += 604800; 
    } 

    return($weekdays); 
} 

例:

// get all fridays between 1st November 2017 and 1st December 2017 
print_r(getWeekDays('2017-11-01','2017-12-01', 5)); 

出力:

Array 
(
    [0] => 2017-11-03 
    [1] => 2017-11-10 
    [2] => 2017-11-17 
    [3] => 2017-11-24 
    [4] => 2017-12-01 
) 

this linkにアクセスして、スクリプトの完全なデモをテストしてください。

1

あなたがあなたの問題が何であったかに興味がないようだが、あなたの元のコードを簡単に修正されました:

<?php 

function getFridaysInRange($dateFromString, $dateToString) 
{ 
    $dateFrom = new \DateTime($dateFromString); 
    $dateTo = new \DateTime($dateToString); 
    $dates = []; 

    if (5 != $dateFrom->format('N')) { 
     $dateFrom->modify('next friday'); 
    } 

    if ($dateFrom > $dateTo) { 
     return $dates; 
    } 

    while ($dateFrom <= $dateTo) { 
     $dates[] = $dateFrom->format('Y-m-d'); 
     $dateFrom->modify('+1 week'); 
    } 

    return $dates; 
} 

var_dump(getFridaysInRange('2017-11-28', '2018-03-31')); 

主な問題は、週の日にあなたの一定のチェックだったされている必要があります5(あなたが金曜日にチェックしていると仮定します)。

また、dateFrom> dateToのチェックを並べ替えると、dateFromを変更すると実際にdateToを超えてプッシュできるようになり、それがそこにキャッチしようとしています。

出力:

array(18) { 
    [0]=> 
    string(10) "2017-12-01" 
    [1]=> 
    string(10) "2017-12-08" 
    [2]=> 
    string(10) "2017-12-15" 
    [3]=> 
    string(10) "2017-12-22" 
    [4]=> 
    string(10) "2017-12-29" 
    [5]=> 
    string(10) "2018-01-05" 
    [6]=> 
    string(10) "2018-01-12" 
    [7]=> 
    string(10) "2018-01-19" 
    [8]=> 
    string(10) "2018-01-26" 
    [9]=> 
    string(10) "2018-02-02" 
    [10]=> 
    string(10) "2018-02-09" 
    [11]=> 
    string(10) "2018-02-16" 
    [12]=> 
    string(10) "2018-02-23" 
    [13]=> 
    string(10) "2018-03-02" 
    [14]=> 
    string(10) "2018-03-09" 
    [15]=> 
    string(10) "2018-03-16" 
    [16]=> 
    string(10) "2018-03-23" 
    [17]=> 
    string(10) "2018-03-30" 
} 
関連する問題