【问题标题】:php function for get all mondays within date rangephp函数获取日期范围内的所有星期一
【发布时间】:2011-10-27 01:39:58
【问题描述】:

示例: $startDate 是 2007 年 2 月 5 日星期一,$endDate 是 2007 年 2 月 20 日星期二。然后我希望它列出:

Monday 2007-02-05
Monday 2007-02-12
Monday 2007-02-19

我查看了 PHP 手册,发现这是获取两个日期之间的所有天数。但是如何按照我想要的方式去做呢? PHP代码:

【问题讨论】:

  • “PHP 代码:”之后的代码在哪里?

标签: php strtotime


【解决方案1】:

我对回复https://stackoverflow.com/a/37300272/6871295做了一些修改

然后我可以获取任何日期的日期之间的天数并返回格式。

    public function getWeekDayInRange($weekday, $dateFromString, $dateToString, $format = 'Y-m-d')
    {
        $dateFrom = new \DateTime($dateFromString);
        $dateTo = new \DateTime($dateToString);
        $dates = [];

        if ($dateFrom > $dateTo) {
            return $dates;
        }

        if (date('N', strtotime($weekday)) != $dateFrom->format('N')) {
            $dateFrom->modify("next $weekday");
        }

        while ($dateFrom <= $dateTo) {
            $dates[] = $dateFrom->format($format);
            $dateFrom->modify('+1 week');
        }

        return $dates;
    }

【讨论】:

    【解决方案2】:

    只需添加为,

    $date_from = "2007-02-05";
    $date_from = strtotime($date_from);
    
    $date_to="2007-02-20";
    $date_to = strtotime($date_to);
    
    for ($i=$date_from; $i<=$date_to; $i+=86400) {
    $day = date("Y-m-d", $i);
    $unixTimestamp = strtotime($day);
    
    $dayOfWeek = date("l", $unixTimestamp);
    
    if ($dayOfWeek == "Monday") {
        echo $day ."is a". $dayOfWeek;
    }
    }//end for
    

    【讨论】:

      【解决方案3】:

      将之前的 $startDate 和 $endDate 转换为时间戳:

      foreach ($date = $startDate; $date <= $endDate; $date += 60 * 60 * 24) {
          if (strftime('%w', $date) == 1) {
              $mondays[] = strftime('%A %Y-%m-%d', $date);
          }
      }
      

      【讨论】:

        【解决方案4】:
        $dates = array();
        $dates[] = strtotime($start);
        for($i = 0; $i <= 12; $i++){
            $dates[] = strtotime('+1 week', $dates[$i]);
        }
        foreach($dates as $date){ echo date("d.m.Y", $date); }
        

        我有类似的问题,课程可以在任何一天开始。此脚本每周选择开始日期并收集接下来的几天,直到所需数量(在本例中为 12)。

        【讨论】:

          【解决方案5】:

          我创建一个类,你得到所有日期范围日期组按日期名称:

           class DayHelper{
          
                const MONDAY = 'Mon';
                const TUESDAY = 'Tue';
                const WEDENSDAY = 'Wed';
                const THURSDAY = 'Thu';
                const FRIDAY = 'Fri';
                const SATURDAY = 'Sat';
                const SUNDAY = 'Sun';
          
             public function GetYeardays($dateStart, $dateend){
              $period = new \DatePeriod(
                      new \DateTime($dateStart), new \DateInterval('P1D'), (new \DateTime($dateend))
              );
              $dates = iterator_to_array($period);
          
              $arrayreturn = array();
              foreach ($dates as $val) {
                  $date = $val->format('Y-m-d'); //format date
                  $get_name = date('l', strtotime($date)); //get week day
                  $day_name = substr($get_name, 0, 3); // Trim day name to 3 chars
                  switch ($day_name) {
                      case self::MONDAY:
                          $MONDAY[] = $date;
                          $arrayreturn[self::MONDAY] = $MONDAY;
                          break;
                      case self::TUESDAY:
                          $TUESDAY[] = $date;
                          $arrayreturn[self::TUESDAY] = $TUESDAY;
                          break;
                      case self::WEDENSDAY:
                          $WEDENSDAY[] = $date;
                          $arrayreturn[self::WEDENSDAY] = $WEDENSDAY;
                          break;
                      case self::THURSDAY:
                          $THURSDAY[] = $date;
                          $arrayreturn[self::THURSDAY] = $THURSDAY;
                          break;
                      case self::FRIDAY:
                          $FRIDAY[] = $date;
                          $arrayreturn[self::FRIDAY] = $FRIDAY;
                          break;
                      case self::SATURDAY:
                          $SATURDAY[] = $date;
                          $arrayreturn[self::SATURDAY] = $SATURDAY;
                          break;
                      case self::SUNDAY:
                          $SUNDAY[] = $date;
                          $arrayreturn[self::SUNDAY] = $SUNDAY;
                          break;
                  }
              }
              return $arrayreturn;
            }
          } 
          

          输出会是这样的

           array (size=7)
           'Fri' => 
            array (size=5)
            0 => string '2016/01/01' (length=10)
            1 => string '2016/01/08' (length=10)
            2 => string '2016/01/15' (length=10)
            3 => string '2016/01/22' (length=10)
            4 => string '2016/01/29' (length=10)
           'Sat' => 
          array (size=5)
            0 => string '2016/01/02' (length=10)
            1 => string '2016/01/09' (length=10)
            2 => string '2016/01/16' (length=10)
            3 => string '2016/01/23' (length=10)
            4 => string '2016/01/30' (length=10)
           'Sun' => 
          array (size=4)
            0 => string '2016/01/03' (length=10)
            1 => string '2016/01/10' (length=10)
            2 => string '2016/01/17' (length=10)
            3 => string '2016/01/24' (length=10)
           'Mon' => 
          array (size=4)
            0 => string '2016/01/04' (length=10)
            1 => string '2016/01/11' (length=10)
            2 => string '2016/01/18' (length=10)
            3 => string '2016/01/25' (length=10)
           'Tue' => 
          array (size=4)
            0 => string '2016/01/05' (length=10)
            1 => string '2016/01/12' (length=10)
            2 => string '2016/01/19' (length=10)
            3 => string '2016/01/26' (length=10)
           'Wed' => 
          array (size=4)
            0 => string '2016/01/06' (length=10)
            1 => string '2016/01/13' (length=10)
            2 => string '2016/01/20' (length=10)
            3 => string '2016/01/27' (length=10)
            'Thu' => 
          array (size=4)
            0 => string '2016/01/07' (length=10)
            1 => string '2016/01/14' (length=10)
            2 => string '2016/01/21' (length=10)
            3 => string '2016/01/28' (length=10)
          

          【讨论】:

            【解决方案6】:

            我需要同样的方法并创建了一个简单的方法。

            public function getMondaysInRange($dateFromString, $dateToString)
            {
                $dateFrom = new \DateTime($dateFromString);
                $dateTo = new \DateTime($dateToString);
                $dates = [];
            
                if ($dateFrom > $dateTo) {
                    return $dates;
                }
            
                if (1 != $dateFrom->format('N')) {
                    $dateFrom->modify('next monday');
                }
            
                while ($dateFrom <= $dateTo) {
                    $dates[] = $dateFrom->format('Y-m-d');
                    $dateFrom->modify('+1 week');
                }
            
                return $dates;
            }
            

            那就用吧。

            $dateFromString = '2007-02-05';
            $dateToString = '2007-02-20';
            var_dump($this->getMondaysInRange($dateFromString, $dateToString));
            

            结果:

            array (size=3)
              0 => string '2007-02-05' (length=10)
              1 => string '2007-02-12' (length=10)
              2 => string '2007-02-19' (length=10)
            

            也许它会对某人有所帮助。

            【讨论】:

              【解决方案7】:

              您可以使用以下函数来获取特定日期日期范围之间的日期数组。

              您必须在数字中输入开始日期、结束日期和天数。天数如下。 1 = 星期一,2 = 星期二,3 = 星期三,4 = 星期四。 5 = 星期五,6 = 星期六,7 = 星期日。

              function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number){
              $endDate = strtotime($endDate);
              $days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday');
              for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
              $date_array[]=date('Y-m-d',$i);
              
              return $date_array;
               }
              

              【讨论】:

              • 如何转换它以使其接受天数数组,例如周一、周二、周三等返回?
              【解决方案8】:

              这是获取“$startdate”的工作日并计算两个日期之间的工作日数的代码。

              `$startdate` = '2015-03-01'; `$endate` = '2015-03-31'; `$recurringDay` = date('N', strtotime($startdate)); // 从日期开始的循环日,即星期一 = 1,星期二 = 2 ...等 $begin = new DateTime(`$startdate`); $end = new DateTime(date('Y-m-d',strtotime('+1 day', strtotime($endate)))); while($begin format('Y-m-d'); $day[] = $begin->format('N'); $begin->modify('+1 天'); } $c=0; // 计数器开始 foreach($day as $key=>$dt) { if ($dt==`$recurringDay`) // 比较 { $k[] = $key; $c++; } } `$nofDays` = $c; // 星期一、星期二的数目 foreach($k as $pp) { //添加会话代码 `$recurringDatetime[]` = $period[$pp]; // 重复日期 } print_r(`$recurringDatetime`); // 星期一、星期二 ..etc 的日期数组

              【讨论】:

              • 这是获取 "$startdate" 的工作日的代码,并且两个日期之间存在工作日数。
              【解决方案9】:

              与其获取所有天并循环遍历它们,不如获取开始日期后的第一个星期一,然后一次迭代 7 天:

              $endDate = strtotime($endDate);
              for($i = strtotime('Monday', strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
                  echo date('l Y-m-d', $i);
              

              【讨论】:

              • 你应该使用 strtotime("+1 week", $i) 而不是添加幻数 604800,否则会出现夏令时问题。
              • 如果是星期一,您将跳过 $endDate。
              • 最后一件事:"strtotime($endDate)" 将在每一步计算,最好引入一个新变量并将其放入第一部分:for ($i=.. , $n=strtotime(); $i
              【解决方案10】:
              for ($i = strtotime($startDate); $i <= strtotime($endDate); $i = strtotime('+1 day', $i)) {
                if (date('N', $i) == 1) //Monday == 1
                  echo date('l Y-m-d', $i); //prints the date only if it's a Monday
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-12-08
                • 1970-01-01
                • 1970-01-01
                • 2015-10-29
                • 2020-10-09
                • 1970-01-01
                • 2022-01-05
                • 1970-01-01
                相关资源
                最近更新 更多