2017-05-24 22 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演示

相关问题