【问题标题】:PHP: DateInterval every two weeks in X daysPHP:在 X 天内每两周进行一次 DateInterval
【发布时间】:2017-10-24 03:39:53
【问题描述】:

我有一个开始日期和结束日期。
我正在尝试每两周的所有星期二和星期三。

示例:

2017-05-23 (tu)
2017-05-24(我们)

2017-06-06 (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)  
...

【问题讨论】:

  • 您是指周二和周三还是周三和周四?
  • 你的星期三和星期四是从后到前的 :)
  • @fubar 更新问题!
  • @Victor Sooo,您现在是说希望从开始日期到年底的每个星期日、星期三和星期五都在一个单一的一维数组中吗?每两周的周二和周三发生了什么?你确定你知道你的要求吗?

标签: php arrays date date-range dateinterval


【解决方案1】:

一种方法

/**
 * @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 周二 2017-05-24 周三 2017-05-27 周六 2017-06-06 周二 2017-06-07 周三 2017-06-10 周六 2017-06-20 周二 2017-06-21 周三

3v4l演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2018-02-14
    • 1970-01-01
    • 2012-01-26
    • 2012-11-13
    • 2022-07-16
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多