首页 > 解决方案 > 从 PHP 中的日期范围获取一周的开始和结束日期

问题描述

我正在使用下面的代码从给定的日期范围获取周开始(星期一)和结束日期(星期日)。

function getWeekDates($date, $start_date, $end_date) {
        $week =  date('W', strtotime($date));
        $year =  date('Y', strtotime($date));
        $month =  date('M', strtotime($date));
        $from = date("Y-m-d", strtotime("{$year}-W{$week}")); //Returns the date of monday in week
        if($from < $start_date) $from = $start_date;
        $to = date("Y-m-d", strtotime("{$year}-W{$week}-7"));   //Returns the date of sunday in week
        if($to > $end_date) $to = $end_date;
        $d =  date('d', strtotime($from));
        return ['week'=>$month."-".$d,'st'=>$from,'end'=>$to];
    }  

    function getWeekDatesArr($start_date = null , $end_date = null) {
        $arr = [];
        for($date = $start_date; $date <= $end_date; $date = date('Y-m-d', strtotime($date. ' + 7 days'))) {
            $list = getWeekDates($date, $start_date, $end_date);
            $arr[$list['week']] = ['start'=>$list['st'],'end'=>$list['end']];
        }
        return $arr;
    }

    $start_date = '2019-10-14';
    $end_date = '2020-01-05';
    $dates = getWeekDatesArr($start_date, $end_date);
    echo "<pre>";
    print_r($dates);

在此处查看代码和预览

在输出中最后开始和结束日期是错误的。它没有显示明年

[Dec-23] => Array
        (
            [start] => 2019-12-23
            [end] => 2019-12-29
        )

    [Dec-14] => Array
        (
            [start] => 2019-10-14
            [end] => 2019-01-06
        )

标签: phpdate

解决方案


使用DateTime 类更加容易和清晰。

<?php
$start_date = '2019-10-14';
$end_date = '2020-01-05';

$date = date_create($start_date);
$end = date_create($end_date);

$dates = [];
while($date < $end){
  $key = $date->format('M-d');
  $dates[$key] = [
    'start' => $date->format('Y-m-d'),
    'end'   => $date->modify('next Sunday')->format('Y-m-d')
  ];
  $date->modify('next Monday'); 
}

//test output
echo "<pre>";
var_dump($dates);

注意: 作为“Md”的键可能会导致问题。在几年的时间里,密钥不再是唯一的。最好将年份也包含在密钥中。


推荐阅读