【问题标题】:How to generate random date between two dates using php?如何使用php在两个日期之间生成随机日期?
【发布时间】:2010-12-30 16:07:19
【问题描述】:

我正在编写一个应用程序,我需要在两个固定时间戳之间分配随机日期

我如何使用我首先搜索的 php 来实现这一点,但只找到了 Java 而不是 php 的答案

例如:

$string = randomdate(1262055681,1262055681);

【问题讨论】:

  • 是我,还是限制是一样的? :)
  • 截至 2016 年,@Sam 的答案应该是公认的,因为我们都应该转移到 DateTime 而不是使用 date-functions。
  • -1:两个推算的时间戳相等?你不会得到任何随机! +1,因为这是一个好问题。

标签: php date datetime timestamp


【解决方案1】:

如果你使用 laravel,那么它适合你。

\Carbon\Carbon::now()->subDays(rand(0, 90))->format('Y-m-d');

【讨论】:

    【解决方案2】:
    // Find a randomDate between $startDate and $endDate
    function randomDate($startDate, $endDate)
    {
        // Convert to timetamps
        $min = strtotime($startDate);
        $max = strtotime($endDate);
    
        // Generate random number using above bounds
        $val = rand($min, $max);
    
        // Convert back to date
        return Carbon::createFromTimestamp($val);
    }
    
    dd($this->randomDate('2014-12-10', Carbon::now()->toString()));
    

    使用碳

    【讨论】:

      【解决方案3】:

      我之前也遇到过同样的情况,以上答案都没有解决我的问题,所以我

      自带新功能

      function randomDate($startDate, $endDate, $count = 1 ,$dateFormat = 'Y-m-d H:i:s')
      {
         //inspired by
          // https://gist.github.com/samcrosoft/6550473
      
          // Convert the supplied date to timestamp
          $minDateString = strtotime($startDate);
          $maxDateString = strtotime($endDate);
      
          if ($minDateString > $maxDateString) 
          {
              throw new Exception("From Date must be lesser than to date", 1);
      
          }
      
          for ($ctrlVarb = 1; $ctrlVarb <= $count; $ctrlVarb++) 
          { 
             $randomDate[] = mt_rand($minDateString, $maxDateString); 
          }
          if (sizeof($randomDate) == 1) 
          {
              $randomDate = date($dateFormat, $randomDate[0]);
              return $randomDate;
          }elseif (sizeof($randomDate) > 1) 
          {
              foreach ($randomDate as $randomDateKey => $randomDateValue) 
              {
                 $randomDatearray[] =  date($dateFormat, $randomDateValue);
              }
              //return $randomDatearray;
              return array_values(array_unique($randomDatearray));
          }
      }
      

      现在是测试部分(测试时数据可能会改变)

      $fromDate = '2012-04-02';
      $toDate = '2018-07-02';
      

      print_r(randomDate($fromDate,$toDate,1));

      结果是

      2016-01-25 11:43:22
      

      print_r(randomDate($fromDate,$toDate,1));

      array:10 [▼
        0 => "2015-08-24 18:38:26"
        1 => "2018-01-13 21:12:59"
        2 => "2018-06-22 00:18:40"
        3 => "2016-09-14 02:38:04"
        4 => "2016-03-29 17:51:30"
        5 => "2018-03-30 07:28:48"
        6 => "2018-06-13 17:57:47"
        7 => "2017-09-24 16:00:40"
        8 => "2016-12-29 17:32:33"
        9 => "2013-09-05 02:56:14"
      ]
      

      但是经过几次测试后,我在想如果输入是什么样的

      $fromDate ='2018-07-02 09:20:39';
      $toDate = '2018-07-02 10:20:39';
      

      因此在生成大量日期时可能会发生重复,例如10,000

      所以我添加了array_unique,这将只返回非重复项

      【讨论】:

        【解决方案4】:

        我们可以使用 date_format 的另一种解决方案:

         /**
         * Method to generate random date between two dates
         * @param $sStartDate
         * @param $sEndDate
         * @param string $sFormat
         * @return bool|string
         */
        
        function randomDate($sStartDate, $sEndDate, $sFormat = 'Y-m-d H:i:s') {
            // Convert the supplied date to timestamp
            $fMin = strtotime($sStartDate);
            $fMax = strtotime($sEndDate);
            // Generate a random number from the start and end dates
            $fVal = mt_rand($fMin, $fMax);
            // Convert back to the specified date format
            return date($sFormat, $fVal);
        }
        

        来源:https://gist.github.com/samcrosoft/6550473

        您可以使用例如:

        $date_random = randomDate('2018-07-09 00:00:00','2018-08-27 00:00:00');
        

        【讨论】:

          【解决方案5】:

          另一种使用PHP的解决方案DateTime

          $start$endDateTime 对象,我们转换为时间戳。然后我们使用mt_rand 方法来获取它们之间的随机时间戳。最后我们重新创建一个DateTime 对象。

          function randomDateInRange(DateTime $start, DateTime $end) {
              $randomTimestamp = mt_rand($start->getTimestamp(), $end->getTimestamp());
              $randomDate = new DateTime();
              $randomDate->setTimestamp($randomTimestamp);
              return $randomDate;
          }
          

          【讨论】:

          • 我们都应该转到DateTime 而不是date()-functions。话虽如此,这是最好的解决方案。
          • 很棒的解决方案喜欢 \DateTime 的使用
          【解决方案6】:

          通过在两个日期之间使用 carbon 和 php rand

          $startDate = Carbon::now();
          $endDate   = Carbon::now()->subDays(7);
          
          $randomDate = Carbon::createFromTimestamp(rand($endDate->timestamp, $startDate->timestamp))->format('Y-m-d');
          

          $randomDate = Carbon::now()->subDays(rand(0, 7))->format('Y-m-d');
          

          【讨论】:

            【解决方案7】:

            很好的问题;需要为应用生成一些随机样本数据。

            您可以使用带有可选参数的following function 来生成随机日期:

            function randomDate($startDate, $endDate, $format = "Y-M-d H:i:s", $timezone = "gmt", $mode = "debug")
            {
                return $result;
            }
            

            样本输入:

            echo 'UTC: ' . randomDate("1942-01-19", "2016-06-03", "Y-M-d H:i:s", "utc") . '<br>';
            //1942-Jan-19 07:00:00
            
            echo 'GMT: ' . randomDate("1942-01-19", "2016-06-03", "Y/M/d H:i A", "gmt") . '<br>'; 
            //1942/Jan/19 00:00 AM
            
            echo 'France: ' . randomDate("1942-01-19", "2016-06-03", "Y F", "Europe/Paris") . '<br>';
            //1942 January
            
            echo 'UTC - 4 offset time only: ' . randomDate("1942-01-19", "2016-06-03", "H:i:s", -4) . '<br>';
            //20:00:00
            
            echo 'GMT +2 offset: ' . randomDate("1942-01-19", "2016-06-03", "Y-M-d H:i:s", 2) . '<br>';
            //1942-Jan-19 02:00:00
            
            echo 'No Options: ' . randomDate("1942-01-19", "2016-06-03") . '<br>';
            //1942-Jan-19 00:00:00
            

            读者的要求可能因应用程序而异,通常希望此功能是一个方便的工具,您需要为您的应用程序生成一些随机日期/示例数据。

            请注意该函数最初处于调试模式,因此请将其更改为$mood="",而不是在生产中调试。

            函数接受:

            1. 开始日期
            2. 结束日期
            3. 格式:任何 php 接受的日期或时间格式
            4. 时区:名称或偏移量
            5. 模式:调试、纪元、详细纪元或详细

            非调试模式下的输出是根据可选规范的随机数。

            用 PHP 7.x 测试

            【讨论】:

              【解决方案8】:

              这里strtotime 的数量太高了。
              对于兴趣跨越 1971 年之前和 2038 年之后的任何人,这里有一个现代、灵活的解决方案:

              function random_date_in_range( $date1, $date2 ){
                  if (!is_a($date1, 'DateTime')) {
                      $date1 = new DateTime( (ctype_digit((string)$date1) ? '@' : '') . $date1);
                      $date2 = new DateTime( (ctype_digit((string)$date2) ? '@' : '') . $date2);
                  }
                  $random_u = random_int($date1->format('U'), $date2->format('U'));
                  $random_date = new DateTime();
                  $random_date->setTimestamp($random_u);
                  return $random_date->format('Y-m-d') .'<br>';
              }
              

              可以通过多种方式调用它...

              // timestamps
              echo random_date_in_range(157766400,1489686923);
              
              // any date string
              echo random_date_in_range('1492-01-01','2050-01-01');
              
              // English textual parsing
              echo random_date_in_range('last Sunday','now');
              
              // DateTime object
              $date1 = new DateTime('1000 years ago');
              $date2 = new DateTime('now + 10 months');
              echo random_date_in_range($date1, $date2);
              

              按原样,该函数需要date1 date2。

              【讨论】:

                【解决方案9】:

                最好的方法:

                $timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
                $random_Date = date("d.m.Y", $timestamp );
                

                【讨论】:

                • 非常优雅的解决方案。谢谢。
                【解决方案10】:
                $yeni_tarih = date('Y-m-d', strtotime( '+'.mt_rand(-90,0).' days'))." ".date('H', strtotime( '+'.mt_rand(0,24).' hours')).":".rand(1,59).":".rand(1,59);
                

                完全随机的日期和时间

                【讨论】:

                  【解决方案11】:

                  最简单的,这个小功能对我有用 我把它写在一个帮助类datetime中作为一个静态方法

                  /**
                   * Return date between two dates
                   *
                   * @param String $startDate
                   * @param String $endDate
                   * @return String
                   *
                   * @author Kuldeep Dangi <kuldeepamy@gmail.com>
                   */
                  public static function getRandomDateTime($startDate, $endDate)
                  {
                      $randomTime = mt_rand(strtotime($startDate), strtotime($endDate));
                      return date(self::DATETIME_FORMAT_MYSQL, $randomTime);
                  
                  }
                  

                  【讨论】:

                    【解决方案12】:

                    如果给定的日期是日期时间格式,那么最简单的方法是将两个数字都转换为时间戳,然后将它们设置为随机数生成器的最小和最大界限。

                    一个简单的 PHP 示例是:

                    // Find a randomDate between $start_date and $end_date
                    function randomDate($start_date, $end_date)
                    {
                        // Convert to timetamps
                        $min = strtotime($start_date);
                        $max = strtotime($end_date);
                    
                        // Generate random number using above bounds
                        $val = rand($min, $max);
                    
                        // Convert back to desired date format
                        return date('Y-m-d H:i:s', $val);
                    }
                    

                    此函数使用 zombat 建议的 strtotime() 将日期时间描述转换为 Unix 时间戳,并使用 date() 从已生成的随机时间戳中生成有效日期。

                    【讨论】:

                      【解决方案13】:

                      这是另一个例子:

                      $datestart = strtotime('2009-12-10');//you can change it to your timestamp;
                      $dateend = strtotime('2009-12-31');//you can change it to your timestamp;
                      
                      $daystep = 86400;
                      
                      $datebetween = abs(($dateend - $datestart) / $daystep);
                      
                      $randomday = rand(0, $datebetween);
                      
                      echo "\$randomday: $randomday\n";
                      
                      echo date("Y-m-d", $datestart + ($randomday * $daystep)) . "\n";
                      

                      【讨论】:

                        【解决方案14】:

                        您可以只使用随机数来确定随机日期。获取介于 0 和日期之间天数之间的随机数。然后只需将该数字添加到第一个日期即可。

                        例如,要获取从现在到 30 天之间的随机数天数的日期。

                        echo date('Y-m-d', strtotime( '+'.mt_rand(0,30).' days'));
                        

                        【讨论】:

                          【解决方案15】:

                          PHP 有rand() 函数:

                          $int= rand(1262055681,1262055681);
                          

                          它还有mt_rand(),通常声称在结果中有更好的随机性:

                          $int= mt_rand(1262055681,1262055681);
                          

                          要将时间戳转为字符串,可以使用date(),即:

                          $string = date("Y-m-d H:i:s",$int);
                          

                          【讨论】:

                          • 补充一点,一旦你的随机数出来,把它当作一个新的时间戳,并从中构造一个日期。
                          • @Sudhir - 绝对。 @NetCaster - 您可以使用 date() 函数非常轻松地从时间戳创建日期字符串。
                          • 使用DateTime查看@Sam 的最新解决方案
                          猜你喜欢
                          • 2010-10-07
                          • 2015-10-01
                          • 1970-01-01
                          • 2016-05-16
                          • 2017-06-03
                          • 2014-09-25
                          • 2017-06-27
                          • 2016-01-04
                          相关资源
                          最近更新 更多