【问题标题】:Split the current month in to weeks in php在php中将当前月份拆分为几周
【发布时间】:2016-05-14 09:26:15
【问题描述】:

我想把当前月份分成几个星期,比如第一天到星期六,然后星期天到下一个星期六。例如:五月,所以我想把它分开

2016-05-01 to 2016-05-07
2016-05-08 to 2016-05-14
2016-05-15 to 2016-05-21
2016-05-22 to 2016-05-28
2016-05-29 to 2016-05-31

如果我尝试下面的代码,我没有得到确切的结果。

<?php

$start_date = date('Y-m-d', strtotime('2016-06-01'));
$end_date = date('Y-m-d', strtotime('2016-06-30'));
$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")); 
    if($from < $start_date) $from = $start_date;

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7"));   
    if($to > $end_date) $to = $end_date;

    echo $from." - ".$to.'<br>';    
}

?>

我喜欢

2016-05-01 - 2016-05-01
2016-05-01 - 2016-05-08
2016-05-08 - 2016-05-15
2016-05-15 - 2016-05-22
2016-05-22 - 2016-05-29

在 for 循环中,在检查最后一组天时,条件失败。所以它不计算 30,31。

我该怎么做?

【问题讨论】:

  • 可能是这个问题 W - ISO-8601 一年中的周数(从星期一开始的周数)

标签: php date date-range


【解决方案1】:

DateTime、DatePeriod 和 DateInterval 是您快速完成这项工作的好朋友!

See online.

<?php
/**
 * @file
 * Awnser to http://stackoverflow.com/q/37224961/392725
 *
 * @link http://stackoverflow.com/a/37228497/392725
 */
date_default_timezone_set('Europe/Paris');

function getWeekDates(DateTimeInterface $date, $format = 'Y-m-d') {
  $dt        = \DateTimeImmutable::createFromMutable($date);
  $first_day = $dt->modify('first day of this month');
  $last_day  = $dt->modify('last day of this month');
  $period    = new \DatePeriod(
    $first_day,
    \DateInterval::createFromDateString('sunday this week'),
    $last_day,
    \DatePeriod::EXCLUDE_START_DATE
  );

  $weeks = [$first_day->format($format)];
  foreach ($period as $d) {
    $weeks[] = $d->modify('-1 day')->format($format);
    $weeks[] = $d->format($format);
  }
  $weeks[] = $last_day->format($format);

  return array_chunk($weeks, 2);
}

echo "Weeks of the current month:\n";
$weeks = getWeekDates(new \DateTime('now'));
array_walk($weeks, function ($week) {
  vprintf("%s to %s\n", $week);
});

echo "\nWeeks of the month may 2016:\n";
$weeks = getWeekDates(new \DateTime('2016-05'));
array_walk($weeks, function ($week) {
  vprintf("%s to %s\n", $week);
});

echo "\nWeeks of the month june 2016:\n";
$weeks = getWeekDates(new \DateTime('2016-06'));
array_walk($weeks, function ($week) {
  vprintf("%s to %s\n", $week);
});

echo "\nWeeks of the month october 2016:\n";
$weeks = getWeekDates(new \DateTime('2016-10'));
array_walk($weeks, function ($week) {
  vprintf("%s to %s\n", $week);
});

结果:

Weeks of the current month:
2016-05-01 to 2016-05-07
2016-05-08 to 2016-05-14
2016-05-15 to 2016-05-21
2016-05-22 to 2016-05-28
2016-05-29 to 2016-05-31

Weeks of the month may 2016:
2016-05-01 to 2016-05-07
2016-05-08 to 2016-05-14
2016-05-15 to 2016-05-21
2016-05-22 to 2016-05-28
2016-05-29 to 2016-05-31

Weeks of the month june 2016:
2016-06-01 to 2016-06-04
2016-06-05 to 2016-06-11
2016-06-12 to 2016-06-18
2016-06-19 to 2016-06-25
2016-06-26 to 2016-06-30

Weeks of the month october 2016:
2016-10-01 to 2016-10-01
2016-10-02 to 2016-10-08
2016-10-09 to 2016-10-15
2016-10-16 to 2016-10-22
2016-10-23 to 2016-10-29
2016-10-30 to 2016-10-31

【讨论】:

  • 这似乎在 php7 上出错 - 导致最大超时:S
【解决方案2】:

这样试试,我假设你可以根据需要更改月份变量。

$month=5;//pass here your month
$first_date = date("Y-m-1");
do{
  $last_date = date("Y-m-d",strtotime($first_date. " +6 days"));
  $month = date("m",strtotime($last_date));
  if($month!=5)
    $last_date = date("Y-m-t");

  echo "<br>".$first_date." - ".$last_date;
  $first_date = date("Y-m-d",strtotime($last_date. " +1 days"));
}while($month == 5);

在这里查看:https://eval.in/571521

【讨论】:

    【解决方案3】:

    修改了Rishi的代码,修复了一些问题的地方,解决了将二月分成周时闰年的问题:

    $weeks = monthToWeeks(2016, '02');
    
    print_r($weeks); 
    
    function monthToWeeks($y, $m)
    {
        $weeks = [];
        $month = $m;
        $first_date = date("{$y}-{$m}-01");
    
        do {
            $last_date = date("Y-m-d", strtotime($first_date. " +6 days"));
            $month = date("m", strtotime($last_date));
    
            if ($month != $m) {
                $last_date = date("Y-m-t", mktime(0, 0, 0, $m, 1, $y)); 
    
                if ($first_date > $last_date) {
                    break;
                }
             }  
    
             $weeks[] = [$first_date, $last_date];
    
             $first_date = date("Y-m-d", strtotime($last_date. " +1 days"));
    
        } while($month == intval($m));
    
        return $weeks;    
    }
    

    你可以在这里试试https://eval.in/643724

    【讨论】:

      【解决方案4】:
      function getSaturdays($y, $m)
      {
          return new DatePeriod(
              new DateTime("first saturday of $y-$m"),
              DateInterval::createFromDateString('next saturday'),
              new DateTime("last day of $y-$m")
          );
      }
      
      
      function list_week_days($year, $month) {
          $first_month_day =  new DateTime("first day of $year-$month") ;
          echo $first_month_day->format("Y-m-d\n") . '-';
          foreach (getSaturdays($year, $month) as $saturday) {
              echo $saturday->format(" Y-m-d\n");
              echo '-<br>';
              $sunday  = $saturday->modify('next Sunday');
              echo $sunday->format(" Y-m-d\n");
      
          }
          $last_month_day =  new DateTime("last day of $year-$month");
          echo $last_month_day->format("Y-m-d\n");
      }
      
      
      list_week_days(2016, 5);
      

      附言 我鼓励你使用 DateTime 类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-21
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多