将日期范围分为相应的周数

时间:2014-11-25 04:52:57

标签: php mysql date

我有来自和来的日期范围。我想将其转换为周。 假设从日期是1-10-2014,到目前为止是31-10-2014

然后结果是:

第1周:2014年1月1日至2014年10月4日 第二次:2014年5月5日至2014年10月11日 3:2014年10月12日至2014年10月18日 第4期:2014年10月19日至2014年10月25日 5:26-10-2014至31-10-2014

在php.I尝试几个代码,但没有给出绝对结果只给01到7,8到14等。 请帮助。

我已经尝试了

的答案
Get the date of one week from today with PHP in stack overflow


date("Y-m-d",strtotime("+1 week"));

3 个答案:

答案 0 :(得分:9)

此代码段使用星期日作为一周的第一天:

    $start = new DateTime('2014-10-01');
    $end = new DateTime('2014-10-31 23:59');
    $interval = new DateInterval('P1D');
    $dateRange = new DatePeriod($start, $interval, $end);

    $weekNumber = 1;
    $weeks = array();
    foreach ($dateRange as $date) {
        $weeks[$weekNumber][] = $date->format('Y-m-d');
        if ($date->format('w') == 6) {
            $weekNumber++;
        }
    }

每周都会有所有的日子。

如果您只想要每周的第一天和最后一天,那么您可以使用array_shiftarray_pop来获取它们。例如,您可以使用第一周:

    $wk1Start = array_shift($weeks[1]); //gives you first day of week 1
    $wk1End = array_pop($weeks[1]); // give you the last day of week 1

如果您想了解每周的开始和结束日期,可以采用以下方式:

    $ranges = array_map(function($week) {
        return 'start: ' . array_shift($week) 
            . ', end: ' . array_pop($week); },
    $weeks);

这是我$ranges的输出:

    Array
    (
        [1] => start: 2014-10-01, end: 2014-10-04
        [2] => start: 2014-10-05, end: 2014-10-11
        [3] => start: 2014-10-12, end: 2014-10-18
        [4] => start: 2014-10-19, end: 2014-10-25
        [5] => start: 2014-10-26, end: 2014-10-31
    )

答案 1 :(得分:1)

您可以轻松更改星期的开始日期(当前设置为星期一):

$fromDate = '2018-05-03';
$toDate = '2018-08-11';
$result = getWeekRanges($fromDate, $toDate);
array_walk_recursive($result, 'applyFormat');
echo '<pre>';
print_r($result);
echo '</pre>';

function getWeekRanges($start, $end) {
    $timeStart = strtotime($start);
    $timeEnd   = strtotime($end);
    $out       = [];
    $milestones[] = $timeStart;
    $timeEndWeek = strtotime('next Monday', $timeStart);
    while ($timeEndWeek < $timeEnd) {
        $milestones[] = $timeEndWeek;
        $timeEndWeek = strtotime('+1 week', $timeEndWeek);
    }
    $milestones[] = $timeEnd;
    $count = count($milestones);
    for ($i = 1; $i < $count; $i++) {
        if( $i == $count - 1) {
            $out[] = [
                'start' => $milestones[$i - 1],
                'end'   => $milestones[$i]
            ];
        }else{
            $out[] = [
                'start' => $milestones[$i - 1],
                'end'   => $milestones[$i] - 1
            ];
        }
    }
    return $out;
}


function applyFormat(&$item) {
    $item = date('Y-m-d', $item);
}

答案 2 :(得分:0)

尝试

$start_date = date('Y-m-d', strtotime('2014-10-01'));
$end_date = date('Y-m-d', strtotime('2014-10-31'));
$i=1;
for($date = $start_date; $date <= $end_date; $date = date('Y-m-d', strtotime($date. ' + 7 days'))) {
    echo getWeekDates($date, $start_date, $end_date, $i);
    echo "\n";
    $i++;
}

function getWeekDates($date, $start_date, $end_date, $i) {
    $week =  date('W', strtotime($date));
    $year =  date('Y', strtotime($date));
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1")); //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;
    echo "$i th ".$from." to ".$to.'<br>';
}  

输出: -

1 th 2014-10-01 to 2014-10-05
2 th 2014-10-06 to 2014-10-12
3 th 2014-10-13 to 2014-10-19
4 th 2014-10-20 to 2014-10-26
5 th 2014-10-27 to 2014-10-31
相关问题