2017-05-24 47 views
1

我有一個開始日期和結束日期。
我試圖讓所有的週二和每兩個星期的星期三。PHP:DateInterval在X天每兩個星期

實施例:

2017年5月23日(TU)
2017年5月24日(我們)

2017年6月6日(TU)
2017-06- 07(我們)
...

我試圖在PHP做:

$start = new FrozenTime('2017-05-23'); // Date is in this format 'cause I'll save into DB 
$endOfYear = $start->endOfYear(); 

$perWeek = new \DateInterval('P14D'); // I want every 2 weeks 

$periodPerWeek = new \DatePeriod($start, $perWeek, $endOfYear); 

$days = ['2', '3']; // Tuesday and Wednesday 

foreach ($periodPerWeek as $value) { 
    if (in_array($value->format('N'), $days)) { 
     $test[] = [ 
      'start' => $value 
     ];  
    } 
} 

結果:

"start": "2017-05-23", 
"start": "2017-06-06", 
"start": "2017-06-20", 

它變得只有一個陣列的日期。我也需要得到星期三的!我該怎麼做?

重要提示:
開始日期不會總是星期二。用戶可以選擇他想要的星期幾。

例如: 用戶可以在每兩週選擇每個SU,WE和FR。

// start date example: 2017-05-20 (saturday) 
// output should be like: 
2017-05-22 (SU) 
2017-05-24 (WE) 
2017-05-26 (FR) 
2017-06-05 (SU) 
2017-06-07 (WE) 
2017-06-09 (FR) 
... 
+0

你的意思是週二和週三或週三和週四? – fubar

+0

你的週三和週四都回至前:) –

+0

@fubar更新的問題! – Victor

回答

0

你是相當接近,但DatePeriod只會產生日期是每天相隔14天,沒有。

根據您的問題,如果你的開始日期始終是一個星期二,你只需要採取在每個迭代循環的當前日期,然後下一個日期。

請參閱以下內容:

// Prepare start and end dates. Assume start date is a Tuesday based on OP's question 
$start = new DateTime('2017-05-23'); 
$end = new DateTime('2017-12-31'); 

// Prepare interval and date period 
$interval = new DateInterval('P14D'); 
$period = new DatePeriod($start, $interval, $end); 

// Prepare dates collection 
$dates = []; 

// Iterate over date period 
foreach ($period as $date) { 
    // Prepare dates 
    $tuesday = clone $date; 
    $wednesday = $date->add(new DateInterval('P1D')); 

    // Append dates to collection 
    array_push($dates, $tuesday, $wednesday); 
} 

var_dump($dates); 
+0

偉大的問題!但我有一個問題!我的約會不會總是星期二。它是動態的! :( – Victor

+0

開始日期是否始終在星期幾之前?如果你想要星期二和星期三,那麼日期總是星期日,星期一還是星期二?或者如果是週四,週五等,您是否應該選擇下週的週二和週三?用更詳細的要求更新您的問題。 – fubar

+0

問題更新! – Victor

0

一種方式做到這一點

/** 
* @param \DateTime $start 
* @param \DateTime $end 
* @param array $days i.e. ['tue', 'wed', 'sat'] 
* 
* @return array 
*/ 

function every_two_weeks($start, $end, $days) 
{ 
    $dates = []; 

    $mon = new DateTime('mon this week '.$start->format('Y-m-d')); 

    while ($mon <= $end) { 
     $of = 'this week '.$mon->format('Y-m-d'); 

     foreach ($days as $day) { 
      $date = new DateTime("$day $of"); 

      if ($date < $start) { 
       continue; 
      } 

      if ($date > $end) { 
       break 2; 
      } 

      $dates[] = $date; 
     } 

     $mon->add(new DateInterval('P2W')); 
    } 

    return $dates; 
} 

用法:

$start = new DateTime('2017-05-23'); 
$end = new DateTime('2017-06-21'); 

$dates = every_two_weeks($start, $end, ['tue', 'wed', 'sat']); 

輸出:

 
2017-05-23 Tue 
2017-05-24 Wed 
2017-05-27 Sat 
2017-06-06 Tue 
2017-06-07 Wed 
2017-06-10 Sat 
2017-06-20 Tue 
2017-06-21 Wed 

3v4l演示

相關問題