【问题标题】:Split date ranges into corresponding weeks将日期范围拆分为相应的周
【发布时间】:2014-11-25 04:52:56
【问题描述】:

我有调用 from 和 to 的日期范围。我想将其转换为周。 假设从日期是 1-10-2014 到日期是 31-10-2014

那么结果是:

第一周:01-10-2014 至 04-10-2014 第 2 次:05-102014 至 11-10-2014 第三次:2014 年 12 月 10 日至 2014 年 18 月 10 日 第 4 次:2014 年 19 月 10 日至 2014 年 10 月 25 日 第五天:2014 年 10 月 26 日至 2014 年 10 月 31 日

在 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"));

【问题讨论】:

    标签: php mysql date


    【解决方案1】:

    这个 sn-p 使用星期日作为一周的第一天:

        $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
        )
    

    【讨论】:

    • 失败的情况是什么?
    • 当我打印 $weeks 时得到 Array ( [1] => Array ( [0] => 2014-10-01 [1] => 2014-10-02 [2] => 2014- 10-03 [3] => 2014-10-04 ) [2] => 数组 ([0] => 2014-10-05 [1] => 2014-10-06 [2] => 2014-10- 07 [3] => 2014-10-08 [4] => 2014-10-09 [5] => 2014-10-10 [6] => 2014-10-11 ) [3] => 数组 ( [ 0] => 2014-10-12 [1] => 2014-10-13 [2] => 2014-10-14 [3] => 2014-10-15 [4] => 2014-10-16 [ 5] => 2014-10-17 [6] => 2014-10-18 ) 等
    • 正如预期的那样,它将显示一周中的所有日子。如果您只想要开始和结束日期,请移动并弹出每个数组。
    • 如果您查看$weeks 中的每个数组,第一个元素和最后一个元素是您指定的日期范围。 $start = array_shift($weeks[1]) 会给你第一周的第一天,array_pop($weeks[1]) 会给你第一周的最后一天。其他几周也是如此。
    【解决方案2】:

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

    $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);
    }
    

    【讨论】:

      【解决方案3】:

      试试

      $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
      

      【讨论】:

      • 缺少一些日期。05,12,19,26。我也想要星期天
      • 检查现在更新了您需要在开始和结束日期传递正确格式的错误
      • 需要输出:1 th 2014-10-01 to 2014-10-04 2 th 2014-10-05 to 2014-10-11 3 th 2014-10-12 to 2014-10-18 2014-10-19 至 2014-10-25 4 日 2014-10-26 至 2014-10-31 5 日
      • 您是否将正确的格式传递给开始和结束日期?回显您的开始和结束日期并检查
      • 我认为上周是明年,所以还需要计算年份的变化
      猜你喜欢
      • 1970-01-01
      • 2020-02-28
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      相关资源
      最近更新 更多