【问题标题】:PHP Carbon, get all dates between date range?PHP Carbon,获取日期范围之间的所有日期?
【发布时间】:2015-10-29 05:20:11
【问题描述】:

如何在 PHP 中获取两个日期之间的所有日期?更喜欢使用 Carbon 作为日期。

$from = Carbon::now();
$to = Carbon::createFromDate(2017, 5, 21);

我想要这两个日期之间的所有日期.. 但是如何?只能使用 strtotime 函数找到解决方案。

【问题讨论】:

    标签: php php-carbon


    【解决方案1】:

    这也可以这样做:

    new DatePeriod($startDate, new DateInterval('P1D'), $endDate)
    

    请记住,DatePeriod 是一个迭代器,所以如果你想要一个实际的数组:

    iterator_to_array(new DatePeriod($startDate, new DateInterval('P1D'), $endDate))
    

    如果你使用 Laravel,你总是可以创建一个 Carbon 宏:

    Carbon::macro('range', function ($start, $end) {
        return new Collection(new DatePeriod($start, new DateInterval('P1D'), $end));
    });
    

    现在你可以这样做了:

    foreach (Carbon::range($start, $end) as $date) {
       // ...
    }
    

    【讨论】:

      【解决方案2】:

      本教程将提供 laravel carbon 获取两个日期之间所有月份的示例。一步一步解释 laravel carbon 获取所有月份。这篇文章将给你一个简单的例子,说明碳在日期之间的所有月份。我们将使用获取两个日期之间的所有月份 laravel carbon。在这里,创建一个在两个日期之间获取月份的基本示例 laravel。

      命名空间 App\Http\Controllers; 使用碳\碳; 使用碳\碳周期; 类 SignaturePadController 扩展控制器 { /** * 在方法上编写代码 * * @return 响应() */ 公共函数索引() { $result = CarbonPeriod::create('2020-01-01', '2020-12-01'); foreach ($result as $dt) { echo $dt->format("Y-m"); } $dates = $result->toArray(); } }

      来源:https://www.itsolutionstuff.com/post/laravel-carbon-get-all-months-between-two-dates-exampleexample.html

      【讨论】:

        【解决方案3】:

        非常简单的解决方案(它适用于旧的“

        // set $start and $end to any date
        $start = Carbon::now()->addDays(-10);
        $end = Carbon::now();
        
        $dates = [];
        for($i = 0; $i < $end->diffInDays($start); $i++){
            $dates[] = (clone $start)->addDays($i)->format('Y-m-d');
        }
        dd($dates);
        

        【讨论】:

        • 非常慢的解决方案
        • 最快的解决方案显然是使用 CarbonPeriod 但它是一个相对较新的 Caarbon 功能,许多应用程序不能使用它,我的解决方案涵盖较旧的碳版本,并且与 @Sebastien 的解决方案一样快......我刚才量了一下……
        【解决方案4】:
        //To get just an array of dates, follow this.
        
        
                $period = CarbonPeriod::create('2018-06-14', '2018-06-20');
        
                $p = array();
            // If you want just dates
            // Iterate over the period and create push to array
                foreach ($period as $date) {
                    $p[] = $date->format('Y-m-d');
                }
        
            // Return an array of dates
        
                return $p;
        

        【讨论】:

        • 请在您的答案中添加描述,以便任何人都能理解您的代码算法。不要用勺子喂食。
        【解决方案5】:

        这是我使用 Carbon 的方法

        private function generateDateRange(Carbon $start_date, Carbon $end_date)
        {
            $dates = [];
        
            for($date = $start_date->copy(); $date->lte($end_date); $date->addDay()) {
                $dates[] = $date->format('Y-m-d');
            }
        
            return $dates;
        }
        

        【讨论】:

        • 你不会有$start_date等于$end_date的问题吗?如果要在调用此函数后继续使用原始$start_date,则应将原始$start_date 的副本传递给此函数或在for 循环的定义中设置$date = $start_date -&gt; copy(),我会更喜欢。
        【解决方案6】:

        你可以直接使用 Carbon

            $start = Carbon::createFromDate(2017, 5, 21);
            $end = Carbon::now();
        
            while($start < $end){
                echo $start->format("M");
                $start->addMonth();
            }
        

        【讨论】:

          【解决方案7】:

          从 Carbon 1.29 开始,可以这样做:

          $period = CarbonPeriod::create('2018-06-14', '2018-06-20');
          
          // Iterate over the period
          foreach ($period as $date) {
              echo $date->format('Y-m-d');
          }
          
          // Convert the period to an array of dates
          $dates = $period->toArray();
          

          查看文档了解更多详情:https://carbon.nesbot.com/docs/#api-period

          【讨论】:

          • 请记住,您也可以使用$date-&gt;toDateString()Y-m-d 格式获取日期。 Docs.
          【解决方案8】:

          你不能直接使用循环控制变量,下一个一定可以正常工作

          $start = Carbon::today()->startOfWeek();
          $end = Carbon::today()->endOfWeek();
          
          $stack = [];
          
          $date = $start;
          while ($date <= $end) {
          
              if (! $date->isWeekend()) {
                  $stack[] = $date->copy();
              }
              $date->addDays(1);
          }
          
          return $stack;
          

          【讨论】:

            【解决方案9】:

            根据马克贝克的回答,我写了这个函数:

            /**
             * Compute a range between two dates, and generate
             * a plain array of Carbon objects of each day in it.
             *
             * @param  \Carbon\Carbon  $from
             * @param  \Carbon\Carbon  $to
             * @param  bool  $inclusive
             * @return array|null
             *
             * @author Tristan Jahier
             */
            function date_range(Carbon\Carbon $from, Carbon\Carbon $to, $inclusive = true)
            {
                if ($from->gt($to)) {
                    return null;
                }
            
                // Clone the date objects to avoid issues, then reset their time
                $from = $from->copy()->startOfDay();
                $to = $to->copy()->startOfDay();
            
                // Include the end date in the range
                if ($inclusive) {
                    $to->addDay();
                }
            
                $step = Carbon\CarbonInterval::day();
                $period = new DatePeriod($from, $step, $to);
            
                // Convert the DatePeriod into a plain array of Carbon objects
                $range = [];
            
                foreach ($period as $day) {
                    $range[] = new Carbon\Carbon($day);
                }
            
                return ! empty($range) ? $range : null;
            }
            

            用法:

            >>> date_range(Carbon::parse('2016-07-21'), Carbon::parse('2016-07-23'));
            => [
                 Carbon\Carbon {#760
                   +"date": "2016-07-21 00:00:00.000000",
                   +"timezone_type": 3,
                   +"timezone": "UTC",
                 },
                 Carbon\Carbon {#759
                   +"date": "2016-07-22 00:00:00.000000",
                   +"timezone_type": 3,
                   +"timezone": "UTC",
                 },
                 Carbon\Carbon {#761
                   +"date": "2016-07-23 00:00:00.000000",
                   +"timezone_type": 3,
                   +"timezone": "UTC",
                 },
               ]
            

            您还可以传递一个布尔值 (false) 作为第三个参数来排除结束日期。

            【讨论】:

              【解决方案10】:

              这是我所拥有的:

              private function getDatesFromRange($date_time_from, $date_time_to)
                  {
              
                      // cut hours, because not getting last day when hours of time to is less than hours of time_from
                      // see while loop
                      $start = Carbon::createFromFormat('Y-m-d', substr($date_time_from, 0, 10));
                      $end = Carbon::createFromFormat('Y-m-d', substr($date_time_to, 0, 10));
              
                      $dates = [];
              
                      while ($start->lte($end)) {
              
                          $dates[] = $start->copy()->format('Y-m-d');
              
                          $start->addDay();
                      }
              
                      return $dates;
                  }
              

              例子:

              $this->getDatesFromRange('2015-03-15 10:10:10', '2015-03-19 09:10:10');
              

              【讨论】:

                【解决方案11】:

                由于 Carbon 是 PHP 内置 DateTime 的扩展,您应该能够使用 DatePeriod 和 DateInterval,就像使用 DateTime 对象一样

                $interval = new DateInterval('P1D');
                $to->add($interval);
                $daterange = new DatePeriod($from, $interval ,$to);
                
                foreach($daterange as $date){
                    echo $date->format("Ymd"), PHP_EOL;
                }
                

                编辑

                如果需要包含周期的最终日期,那么需要稍微修改一下,在生成DatePeriod之前调整$to

                $interval = new DateInterval('P1D');
                $daterange = new DatePeriod($from, $interval ,$to);
                
                foreach($daterange as $date){
                    echo $date->format("Ymd"), PHP_EOL;
                }
                

                【讨论】:

                • 如果 $to 时间不大,则不会打印间隔的最后日期。我的意思是至少秒必须更大,也许是毫秒,没有尝试过
                • 添加了相关的代码行以将 $to date 包含在期间
                猜你喜欢
                • 2021-11-16
                • 2017-12-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多